Оранжевый виджет с OpenCV setMouseCallback - PullRequest
0 голосов
/ 21 июня 2019

Я разрабатываю Orange Widgets для распознавания лиц.Я хочу нарисовать прямоугольник вокруг лиц, захваченных в видео, установив события мыши с помощью cv2.setMouseCallback.Я могу захватить видео в окне изображения (cv2.namedWindow ("image")) с помощью cv2.VideoCapture (0), но я не могу вызвать функцию MouseCallBack в окне изображения.Я новичок в разработке виджетов Orange и не уверен, что функция cv2.setMouseCallback может работать внутри класса OrangeWidget.Любое предложение / помощь будет принята с благодарностью.Вот код:

class MouseCallBackWidget(OWWidget):

    name = "MouseCallBack"
    # Short widget description
    description = "Draw rectangle"
    icon = "icons/DataSamplerA.svg"

    want_main_area = False
#   with a fixed non resizable geometry.
    resizing_enabled = False 

    def MouseCallBack(self,event, x, y, flags, param):
        #global boxRefPt, boxCX, boxCY, boxW, boxH, click, mode_learn, completed_rect, ix, iy 

        # check if the left mouse button is clicked.
        if event == cv2.EVENT_LBUTTONDOWN:              
            if self.completed_rect == False:                 
                self.boxRefPt = [(x, y)]                     # record the starting (x, y) coordinate of a new rectangle.
                self.ix, self.iy = x, y                           
                self.click = True                           

        # check if the left mouse button is released.        
        elif event == cv2.EVENT_LBUTTONUP:              
            self.boxRefPt.append((x, y))                     # record the ending (x, y) coordinate a new rectangle.
            self.click = False                             
            self.completed_rect = True                      
            self.mode_learn = True

            (x1, y1) = self.boxRefPt[0]
            (x2, y2) = self.boxRefPt[1]

            self.boxCX = min(x1, x2) 
            self.boxCY = min(y1, y2)
            self.boxW = abs(x1 - x2)
            self.boxH = abs(y1 - y2)

    def __init__(self):

        super().__init__()

        from AnyQt.QtGui import QIntValidator

        self.boxRefPt = []
        self.click = False
        self.mode_learn = False
        self.completed_rect = False

        self.ix = 0
        self.iy = 0
        self.boxCX = 0
        self.boxCY = 0
        self.boxW = 0
        self.boxH = 0

        self.cap = cv2.VideoCapture(0)
        cv2.namedWindow("image")

        cv2.setMouseCallback("image", self.MouseCallBack)    

        while (True):

            self.ret, self.frame = self.cap.read()

            if self.completed_rect == True:

                cv2.rectangle(self.frame, self.boxRefPt[0], self.boxRefPt[1], (0, 255, 0), 2)
                cv2.putText(self.frame,'LEARN AREA', (self.boxCX, (self.boxCY - 12)), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), lineType=cv2.LINE_AA)

            cv2.imshow("image", self.frame)
            cv2.waitKey(1)   
...