簡體   English   中英

控制流程_鼠標點擊事件_OpenCV_Python

[英]Flow of control_Mouse click events_OpenCV_Python

我使用 Open CV 在 Python 中編寫了一個程序,在黑色圖像上繪制小圓圈並用一條線將它們連接起來,以測試鼠標單擊事件的使用。 但是我不明白代碼中的控制流。 我從 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' 將圖像狀態恢復到開始狀態,或者您可能想到的任何其他內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM