95498


こちら初心者であまり詳しくありませんが、opencvのマウスイベントを使って円を連続で描き続け線を描けるようにしたいと思っていたのですが、実行すると応答なしと表示されてしまいます。  
マウスの左クリックを押している最中のみ円を描き、離すと終わるようにしたいと思っていたのですが、そこの文をいじっていると応答なしになってしまい、解決策がわかりません。解決策の回答お願いします。

コードはこんな感じです。

[code]

    img = cv2.imread("image01.jpg")
    
    cv2.namedWindow("image")
    
    R = 0
    G = 0
    B = 0
    
    cv2.createTrackbar("R", "image", R, 255, printing)
    cv2.createTrackbar("G", "image", G, 255, printing)
    cv2.createTrackbar("B", "image", B, 255, printing)
    
    def draw_circle(event, x, y, flags, param):
        print (event)
        if event == 1:
            while event <= 1:
                cv2.circle(img,(x,y),7,(B,G,R), thickness=-1)
                if event == 4:
                    break
    
    cv2.setMouseCallback("image", draw_circle)  
    
    while True:
        R = cv2.getTrackbarPos("R", "image")
        G = cv2.getTrackbarPos("G", "image")
        B = cv2.getTrackbarPos("B", "image")
    
        cv2.imshow('image', img)
    
        if cv2.waitKey(10) == 27:
            break
    
    cv2.destroyAllWindows()
    
[/code]


CC BY-SA 4.0
2023-07-06T04:54:57.253
95495
2023-07-06T05:58:30.697
2023-07-06T05:11:36.790
3060
58995
question
python opencv anaconda
opencvでマウスイベントを使って円で線を描こうとすると応答なしと出てしまう


`draw_circle`関数の中で無限ループが発生しています。  
下記のようにマウスボタンの押下状態をフラグで管理することで解決できます。

[code]

    import cv2
    
    img = cv2.imread("image01.jpg")
    
    cv2.namedWindow("image")
    
    R = 0
    G = 0
    B = 0
    
    cv2.createTrackbar("R", "image", R, 255, lambda x: None)
    cv2.createTrackbar("G", "image", G, 255, lambda x: None)
    cv2.createTrackbar("B", "image", B, 255, lambda x: None)
    
    drawing = False  # マウスの左ボタンが押されているかどうかのフラグ
    
    def draw_circle(event, x, y, flags, param):
        global drawing, img, B, G, R
    
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
    
        if drawing:
            cv2.circle(img, (x, y), 7, (B, G, R), thickness=-1)
    
    cv2.setMouseCallback("image", draw_circle)
    
    while cv2.getWindowProperty("image", cv2.WND_PROP_VISIBLE) > 0:
        R = cv2.getTrackbarPos("R", "image")
        G = cv2.getTrackbarPos("G", "image")
        B = cv2.getTrackbarPos("B", "image")
    
        cv2.imshow('image', img)
    
        if cv2.waitKey(10) == 27:
            break
    
    cv2.destroyAllWindows()
    
[/code]


CC BY-SA 4.0
2023-07-06T05:58:30.697
95498
2023-07-06T05:58:30.697
9820
95495
answer