Python OpenCV: Maus-Rückruf zum Zeichnen eines Rechtecks

Ich möchte ein Bild aus dem Videostream speichern und dann ein Rechteck auf das angezeigte Bild zeichnen, um einen Bereich von Interesse zu erzeugen. Speichern Sie diesen ROI später in einer Datei. Ich habe das opencv-Python-Grabcut-Beispiel verwendet, um die setMouseCallback-Funktion zu verwenden. Aber ich weiß nicht, was ich falsch mache, da es nicht das Ergebnis liefert, das ich erwarte. Ich möchte das grüne Rechteck auf dem in @ gezeigten statischen Bild sehmouse input window und der Roi werden in der Datei gespeichert. Bitte helfen Sie beim Debuggen dieses Codes oder zeigen Sie einen besseren Ansatz:

import cv2

rect = (0,0,1,1)
rectangle = False
rect_over = False  
def onmouse(event,x,y,flags,params):
    global sceneImg,rectangle,rect,ix,iy,rect_over

    # Draw Rectangle
    if event == cv2.EVENT_LBUTTONDOWN:
        rectangle = True
        ix,iy = x,y

    elif event == cv2.EVENT_MOUSEMOVE:
        if rectangle == True:
            cv2.rectangle(sceneImg,(ix,iy),(x,y),(0,255,0),2)
            rect = (min(ix,x),min(iy,y),abs(ix-x),abs(iy-y))

    elif event == cv2.EVENT_LBUTTONUP:
        rectangle = False
        rect_over = True
        cv2.rectangle(sceneImg,(ix,iy),(x,y),(0,255,0),2)
        rect = (min(ix,x),min(iy,y),abs(ix-x),abs(iy-y))

        x1,y1,w,h = rect        
        roi = sceneImg[y1:y1+h, x1:x1+w]

        cv2.imwrite('roi.jpg', roi)

# Named window and mouse callback
cv2.namedWindow('video')
cv2.namedWindow('mouse input')
cv2.setMouseCallback('mouse input',onmouse)

camObj = cv2.VideoCapture(-1)
keyPressed = None
running = True
scene = False
# Start video stream
while running:
    readOK, frame = camObj.read()

    keyPressed = cv2.waitKey(5)
    if keyPressed == ord('s'):
        scene = True

        cv2.imwrite('sceneImg.jpg',frame)
        sceneImg = cv2.imread('sceneImg.jpg')

        cv2.destroyWindow('video')
        cv2.imshow('mouse input', sceneImg)

    elif keyPressed == ord('r'):
        scene = False
        cv2.destroyWindow('mouse input')

    elif keyPressed == ord('q'):
        running = False

    if not scene:
        cv2.imshow('video', frame)

cv2.destroyAllWindows()
camObj.release()

Antworten auf die Frage(4)

Ihre Antwort auf die Frage