码迷,mamicode.com
首页 > 编程语言 > 详细

Opencv+Python(4):鼠标作为画笔

时间:2018-03-30 16:21:46      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:container   form   family   str   绘图   indent   button   cut   终端   

鼠标作为画笔

目标

  • 学习处理OpenCV中的鼠标事件
  • 你将学习这些函数:cv2.setMouseCallback()

简单的演示

在这里,我们创建了一个简单的应用程序,无论我们双击它,在图像上绘制一个圆圈。

首先我们创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有关的任何事情,例如左键向下,左键向上,左键双击等等。它给我们每个鼠标事件的坐标(x,y)。有了这个活动和地点,我们可以做任何我们喜欢的事情。要列出所有可用的事件,请在Python终端中运行以下代码:

>>> 进口 CV2 
>>> 事件 =  [     DIR CV2  如果 “事件”   ] 
>>> 打印 事件

创建鼠标回调??函数具有各处相同的特定格式。它仅在功能上有所不同。所以我们的鼠标回调函数做了一件事,它在我们双击的地方绘制了一个圆圈。所以看下面的代码。代码是不言自明的:

导入 cv2 
导入 numpy   np

#鼠标回调函数
def  draw_circle event x y flags param ):
    if  event  ==  cv2 EVENT_LBUTTONDBLCLK 
        cv2 IMG ,(X ? ),100 ,(255 0 0 ),- 1 

#创建一个黑色图像,一个窗口并将该函数绑定到窗口
img  =  np ((512 512 3 ), NP UINT8 
CV2 namedWindow ‘image‘ 
cv2 setMouseCallback ‘image‘ draw_circle 

1 ):
    cv2 imshow ‘image‘ img 
    如果 cv2 waitKey 20   0xFF  ==  27 
        break 
cv2 destroyAllWindows ()

更高级的演示

现在我们去更好的应用。在这里,我们通过像在Paint应用程序中那样拖动鼠标来绘制矩形或圆形(取决于我们选择的模式)。所以我们的鼠标回调函数有两个部分,一个绘制矩形和其他绘制圆圈。这个具体的例子在创建和理解一些交互式应用程序如对象跟踪,图像分割等方面将非常有用。

导入 cv2 
导入 numpy   np

drawing  =  False  #如果按下鼠标,则为true 
mode  =  True  #如果为True,绘制矩形。按‘m‘切换到曲线
ix iy  =  - 1 - 1

#鼠标回调函数
def  draw_circle event x y flags param ):
    全局 ix iy 绘图模式

    如果 event  ==  cv2 EVENT_LBUTTONDOWN 
        drawing  =  True 
        ix iy  =  x y

    elif  事件 ==  cv2 EVENT_MOUSEMOVE 
        if  drawing  ==  True 
            if  mode  ==  True 
                cv2 矩形IMG ,(IX IY ),(X Y ),(0 255 0 ),- 1 
            否则
                CV2 img ,(x y ),5 ,(00 255 ),- 1 

    elif  事件 ==  cv2 EVENT_LBUTTONUP 
        如果模式== True,绘图 =  False 
        cv2 矩形IMG ,(IX IY ),(X Y ),(0 255 0 ),- 1 否则CV2 IMG ,(X ? ),5 ,(0 0   
            
        
            255 ),- 1 

接下来,我们必须将此鼠标回调函数绑定到OpenCV窗口。在主循环中,我们应该为键‘m‘设置键盘绑定,以在矩形和圆形之间切换。

img  =  np ((512 512 3 ), NP UINT8 
CV2 namedWindow ‘image‘ 
cv2 setMouseCallback ‘image‘ draw_circle 

1 ):
    cv2 imshow ‘image‘ img 
    k  =  cv2 waitKey 1   0xFF 
    if  k  ==  ord ‘m‘ ):
        mode  =  not  mode 
    elif  k  ==  27 
        break

cv2 destroyAllWindows ()

Opencv+Python(4):鼠标作为画笔

标签:container   form   family   str   绘图   indent   button   cut   终端   

原文地址:https://www.cnblogs.com/lincolnlu/p/8676418.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!