我已经在 python 中使用 opencv 库加载了一个图像,现在我想使用鼠标绘制一个矩形,但是在绘制矩形时,矩形应该是可见的,以便绘制它的人可以以某种方式放置它,以便对象兴趣完全在矩形中,但我的代码没有产生所需的输出
我的代码是
import os
import sys
import numpy as np
import cv2
baseDir = '/home/aman/Downloads/shirt/'
filenames = next(os.walk(baseDir))[2]
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
tx,ty = -1,-1
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
print 'aman'
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.line(img, (ix,iy),(ix,y), 255, 1, 8, 0)
cv2.line(img, (ix,iy),(x,iy), 255, 1, 8, 0)
cv2.line(img, (ix,y),(x,y), 255, 1, 8, 0)
cv2.line(img, (x,iy),(x,y), 255, 1, 8, 0)
else:
cv2.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
#cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
cv2.rectangle(img,(ix,y),(x,y),(0,255,0),-1)
cv2.rectangle(img,(x,iy),(x,y),(0,255,0),-1)
else:
cv2.circle(img,(x,y),5,(0,0,255),-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()
`
但是产生的输出是这样的
我不想要这种行为,我只想要一个矩形,而不是每个 Action 。我知道我应该修改鼠标移动事件中的代码,但问题是如何做到这一点,以便当人移动鼠标时,他能够看到完整的矩形,当他释放按钮时,矩形应该固定?
最佳答案
您可以将此过程视为在任何其他渲染 API(如 OpenGL)中进行渲染:将某些东西放在屏幕上,然后清洁它,然后在干净的区域上绘制。
在此上下文中,清理意味着恢复原始图像。借鉴它意味着添加您的矩形或其他任何东西。
因此,我建议创建一个只处理此问题的 draw
方法。每当要对呈现目标进行更改时调用它。
一个快速片段(不是真正的 python,只是伪代码):
source_image = Mat()
image = Mat()
rect = Rect()
# general logic and stuff ...
# set a mouseCallbackListener
def listener(evt):
rect.x = evt.x # uptade de rect properly (...)
draw()
# apply the drawing logic
def draw():
image = source_image.clone()
rectangle(image, rect, Scalar(0,255,0), 1, 8, 0)
imshow(WINDOW_NAME, image)
如果你想看一个真实的例子,这里有一段 C++11 代码,让你绘制多个三角形,然后将它们的中心作为输出以响应键盘输入:https://gist.github.com/cirocosta/9f7a57bddb40c4e5cbca
关于python - 在图像opencv上绘制矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29236932/