Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
控制流\u鼠标单击事件\u OpenCV\u Python_Python_Opencv_Mouseclick Event - Fatal编程技术网

控制流\u鼠标单击事件\u OpenCV\u Python

控制流\u鼠标单击事件\u OpenCV\u Python,python,opencv,mouseclick-event,Python,Opencv,Mouseclick Event,我用Python编写了一个程序,使用OpenCV在黑色图像上绘制小圆圈,并用一条线将它们连接起来,以测试鼠标单击事件的使用。但是,我不理解代码中的控制流。我从两个来源得到了这两个变体 请向我解释一下这两种方法的控制流程 第一个代码: 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_LBUTTONDO

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

请向我解释一下这两种方法的控制流程

第一个代码:

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
第二部分

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


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

在第二段代码中,回调函数在while循环之外。即使控制流进入无限while循环,该函数如何每次都被调用?此外,我还编辑了冗余的imshow()。这是我的疏忽。回调函数为偶数设置了一种从常规程序流之外触发函数的方法。因此,回调函数应该位于任何循环之外,除非您使用循环设置具有不同参数的回调函数。