Поток управления_Mouse click events_OpenCV_Python - PullRequest
0 голосов
/ 29 января 2020

Я написал программу на 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()

1 Ответ

0 голосов
/ 29 января 2020

Единственные различия в коде:

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), после чего, по существу, приостанавливается основное тело при получении любых обратных вызовов. Если вы нажмете какую-либо клавишу, программа продолжит работу.

Во второй части настроено именованное окно - ничего особенного делать не нужно. Бесконечный while (True) l oop настроен на постоянную проверку, была ли нажата указанная клавиша c - в данном случае, 'q', которая вырвала бы программу из l oop. Этот l oop также постоянно вызывает cv2.imgshow - что является избыточным, поскольку функция обратного вызова вызывает cv2.imgshow после любых изменений. L oop, как это полезно, если вы хотите добавить дополнительные нажатия клавиш для проверки - возможно, 'r', чтобы вернуть состояние изображения в начало, или что-нибудь еще, о чем вы могли подумать.

...