Python OpenCv学习基础知识二

Python OpenCv学习基础知识二

简介

本文接着上一篇文章:
Python OpenCv学习基础知识一(链接:https://blog.csdn.net/m0_54218263/article/details/122491612?spm=1001.2014.3001.5501),继续介绍Python cv2模块中的一些常用的基本操作与使用的方法,希望对大家有一些帮助。

一、cv2绘图

"""
cv2 绘图

绘制图像的方法



"""




import numpy as np
import cv2








def test1():




    """
    画一条线
    """

    #Create a black image
    img = np.zeros((512,512,3),np.uint8)
    # 产生一个画布


    #draw a diagonal blue line with thickness of 5 px
    cv2.line(img,(0,0),(260,260),(255,0,0),5)

    #为了演示,建窗口显示出来
    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()








def test2():




    """
    画一个矩形
    """
    
    #Create a black image
    img = np.zeros((512,512,3),np.uint8)
    # 相当于也是生成一个画布


    cv2.rectangle(img,(350,0),(500,128),(0,255,0),3)

    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()








def test3():




    """
    画一个圆
    """

    #Create a black image
    img = np.zeros((512,512,3),np.uint8)
    # 创建一个画布

    cv2.rectangle(img,(350,0),(500,128),(0,255,0),3)#矩形
    cv2.circle(img,(425,63),63,(0,0,255),-1)#圆,-1为向内填充
    # 这里其实是在矩形之中有一个圆形的

    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()








def test4():




    """
    画一个椭圆
    """

    #Create a black image
    img = np.zeros((512,512,3),np.uint8)

    cv2.ellipse(img,(256,256),(100,50),0,0,360,255,-1)

    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()








def test5():




    """
    画一个多边形
    """

    
    #Create a black image
    img = np.zeros((512,512,3),np.uint8)

    pts=np.array([[100,50],[200,300],[500,200],[400,100]],np.int32)
    # 根据点的位置来绘制多边形。

    pts = pts.reshape((-1,1,2))
    #这里reshape的第一个参数为-1,表明这一维度的长度是根据后面的维度计算出来的
    cv2.polylines(img,[pts],True,(0,255,255)) 
    #注意第三个参数若是False,我们得到的是不闭合的线

    #为了演示,建窗口显示出来
    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()








def test6():




    """
    添加文字
    """

        
    #Create a black image
    img = np.zeros((512,512,3),np.uint8)

    font = cv2.FONT_HERSHEY_SIMPLEX  
    cv2.putText(img,'OpenCV',(10,300), font, 4,(255,255,255),2,cv2.LINE_AA)  

    #为了演示,建窗口显示出来
    cv2.namedWindow('image',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('image',1000,1000)#定义frame的大小
    cv2.imshow('image',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    # 使用 shift + enter 可以实现单步的调试的工作
    # shift + enter => 单步调试。








if __name__ == '__main__':




    # test1()

    # test2()

    # test3()

    # test4()

    # test5()

    test6()
    




"""
显示结果也可以使用如下所示的代码:

winname='example'
cv2.namedWindow(winname)
cv2.imshow(winname,img)
cv2.waitKey(0)
cv2.destroyAllWindow(winname)

"""



二、鼠标事件处理

"""
鼠标事件处理
"""

import cv2
import numpy as np

# mouse callback function

def draw_circle(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img, (x, y), 100, (255, 0, 0), -1)
# 回调函数的功能


# 创建图像与窗口并将窗口与回调函数绑定
img = np.zeros((500, 500, 3), np.uint8)
cv2.namedWindow('image')


cv2.setMouseCallback('image', draw_circle)  # 回调函数的绑定。

# 创建回调函数的绑定机制

while (1):
    cv2.imshow('image', img)
    if cv2.waitKey(1)&0xFF == ord('q'):#按q键退出
        break
cv2.destroyAllWindows()



三、鼠标事件处理进阶

"""
仍然是鼠标点击事件,但是更加的高级
"""


import cv2
import numpy as np


#当鼠标按下时为True
drawing = False

#如果mode为true时绘制矩形,按下'm'变成绘制曲线
mode = True
ix,iy = -1,-1

#创建回调函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode

    #当按下左键时返回起始位置坐标
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix,iy=x,y

    #当左键按下并移动时绘制图形,event可以查看移动,flag查看是否按下
    elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
        if drawing == True:
            if mode == True:
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                #绘制圆圈,小圆点连在一起就成了线,3代表笔画的粗细
                cv2.circle(img,(x,y),3,(0,0,255),-1)
              
    #当鼠标松开时停止绘图
    elif event ==cv2.EVENT_LBUTTONUP:
        drawing == False



'''
下面把回调函数与OpenCV窗口绑定在一起,在主循环中奖'm'键与模式转换绑定在一起
'''
img = np.zeros((500,500,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)
# 绑定事件


# while 执行
while(1):
    cv2.imshow('image',img)
    k=cv2.waitKey(1)
    # 相当于是25ms

    if k ==ord('m'):
        # 切换状态
        mode=not mode
    elif k==ord('q'):
        # 退出
        break


cv2.destroyAllWindows()
# 销毁窗口





四、总结

以上就是cv2模块绘制图像以及鼠标事件处理的相关代码,谢谢大家的阅读与支持,喜欢的话就点个赞吧。我会再接再厉继续加油创作下去的呢。

おすすめ

転載: blog.csdn.net/m0_54218263/article/details/122510993