我使用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()
代码中唯一的区别是:
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'来将图像状态恢复为开始状态,或者您可能会想到的其他任何方法。