opencv用户绘制矩形以进行裁剪

时间:2016-07-19 19:12:54

标签: python opencv

我试图让用户能够在对象周围绘制一个矩形并裁剪它 -

使用此代码 -

def click_and_crop(event, x, y, flags, param):

global refPt, drawing, cropping

if event == cv2.EVENT_LBUTTONDOWN:
    drawing = True
    refPt = [(x, y)]
    cropping = True

elif event == cv2.EVENT_MOUSEMOVE:
    if drawing == True:
        cv2.rectangle(closeres, refPt[0], (x,y),(0,255,0),2)


elif event == cv2.EVENT_LBUTTONUP:
    drawing = False
    refPt.append((x, y))
    cropping = False

    cv2.rectangle(closeres, refPt[0], refPt[1], (0, 255, 0), 2)
    cv2.imshow("image", closeres)

它绘制了多个矩形,而不仅仅是一个改变大小的矩形,最终看起来像这样 -

enter image description here

任何人都知道如何解决这个问题,所以它会改变大小吗? 如果我改变代码 -

elif event == cv2.EVENT_MOUSEMOVE:
    if drawing == True:
        closeres = cloneclone
        cv2.rectangle(closeres, refPt[0], (x,y),(0,255,0),2)

尝试在每次更改时擦除矩形我最终看不到任何内容,没有矩形并收到此消息 -

追踪(最近一次通话):   在click_and_crop中输入第38行的“project2.py”     cv2.rectangle(closeres,refPt [0],refPt 1,(0,255,0),2) UnboundLocalError:赋值之前引用的局部变量'closeres'

1 个答案:

答案 0 :(得分:2)

每次在事件处理程序开始时,您必须绘制图像,而不是在最后一个if条件内。 然后绘制sizer矩形。否则,不删除前一个矩形。图像逐渐被破坏。 刷新率越高,图像越绿。

可能的优化是使用XOR模式,因此如果再次绘制前一个矩形,它将恢复图像(但在这种情况下矩形不能是纯绿色)但是它更复杂