control_Mouse点击事件流_OpenCV_Python

问题描述 投票:0回答:1

我使用Python用Open CV编写了一个程序,在黑色图像上绘制小圆圈,并用一条线将它们连接起来,以测试鼠标单击事件的使用。但是我不理解代码中的控制流。我从2个来源获得了这2个版本。

请向我解释两者的控制流程。

第一个代码:

import cv2
import numpy as np

x2,y2,c=0,0,0

def click (event,x,y,flags,param):
    global x2,y2,c
    if event==cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img, (x,y), 5, (0,0,255),-1) 
        if (c==0):
            cv2.imshow('image',img)
        else:
            cv2.line(img, (x2,y2), (x,y), (255,255,0), 1, cv2.LINE_AA)
            cv2.imshow('image',img)
        x2,y2=x,y
        c=c+1

img=np.zeros((700,700,3), np.uint8)
cv2.imshow('image',img)

cv2.setMouseCallback('image',click)
cv2.waitKey(0)
cv2.destroyAllWindows()

第二代码:

import cv2
import numpy as np

x2,y2,c=0,0,0

def click (event,x,y,flags,param):
    global x2,y2,c
    if event==cv2.EVENT_LBUTTONDOWN:
        cv2.circle(img, (x,y), 5, (0,0,255),-1) 
        if (c!=0):
            cv2.line(img, (x2,y2), (x,y), (255,255,0), 1, cv2.LINE_AA)
        x2,y2=x,y
        c=c+1

img=np.zeros((700,700,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',click)

while (True):
    cv2.imshow('image',img)
    if cv2.waitKey(20)==ord('q'):
        break

cv2.destroyAllWindows()
python opencv mouseclick-event
1个回答
0
投票

代码中唯一的区别是:

cv2.imshow('image',img)
cv2.setMouseCallback('image',click)
cv2.waitKey(0)

在第1部分,和

cv2.namedWindow('image') 
cv2.setMouseCallback('image',click)

while (True):
    cv2.imshow('image',img)
    if cv2.waitKey(20)==ord('q'):
        break

在第2部分中。

这两个代码都设置了回调函数"cv2.setMouseCallback",在第1部分中,随后调用了无限延迟cv2.waitKey(0),实质上是在获取任何回调时暂停了主体。如果按任意键,程序将继续运行。

在第2部分中,设置了一个命名窗口-无需特别执行任何操作。设置了无限while (True)循环以连续检查是否已按下特定的键-在这种情况下为'q',这将使程序脱离循环。此循环还连续调用cv2.imgshow-这是多余的,因为回调函数在进行任何更改后都会调用cv2.imgshow。如果您想添加其他击键进行检查,则这样的循环很有用-可能是'r'来将图像状态恢复为开始状态,或者您可能会想到的其他任何方法。

© www.soinside.com 2019 - 2024. All rights reserved.