2017-06-17 25 views
-4

キーボードの文字を押して円を描きたいが、円が描画されるのはマウスの移動だけです。Python opencv:キーが押されたときに画像に円を描く

`import cv2 
import numpy as np 
mode = True 
ix,iy = -1,-1 
def draw_circle(event,x,y,flags,param): 
global ix,iy,mode 
    if cv2.waitKey(1) == ord('r'): 
     cv2.circle(img,(x,y),18,(255,0,0),-1) 

img = np.zeros((512,512,3), np.uint8) 
cv2.namedWindow('image') 
cv2.setMouseCallback('image',draw_circle) 

while(1): 
    cv2.imshow('image',img) 
    k = cv2.waitKey(1) & 0xFF 
    if k == ord('m'): 
     mode = not mode 
    elif k == 27: 
     break 
cv2.destroyAllWindows()` 

ありがとうございます!

+0

マウスが移動しているときに描画するのは、マウスのコールバック内にあるためです。 – api55

答えて

1

いくつか間違いがあります。ドローサークルはマウスコールバックとして設定されています。マウスが動いたりクリックしたりすると、その機能が呼び出されます。マウスが現在位置している円を作成することを目的としている場合は、移動またはクリックするたびにマウスの位置のみを記録するようにマウスコールバックを変更できます。そして、あなたがmこの位置にコールドローサークルをヒットするかどうかをチェックするとき。また、私は10ミリ秒の待機をお勧めします。そうでなければ、キーが押されないことがあります(それは私に起こります)ので、数回押す必要があります。私はこのコードをテストしていませんが、それはおそらく正しいです:)私はあなたに役立つことを願っています。

import cv2 
import numpy as np 

ix,iy = -1,-1 
def set_mouse_position(event,x,y,flags,param): 
    global ix,iy 
    ix,iy = x,y 

img = np.zeros((512,512,3), np.uint8) 
cv2.namedWindow('image') 
cv2.setMouseCallback('image',set_mouse_position) 

while(1): 
    cv2.imshow('image',img) 
    k = cv2.waitKey(10) & 0xFF 
    if k == ord('m'): 
     cv2.circle(img,(ix,iy),18,(0,0,0),-1) 
    elif k == 27: 
     break 
cv2.destroyAllWindows() 
関連する問題