我有这样的代码,用户可以选择一个矩形的图像裁剪它,但矩形是不可见的,而他们正在绘制它使它变得困难。有人知道我如何修改这样的代码,使其在我绘图时可见吗?
这是我的裁剪方法-
def click_and_crop(event, x, y, flags, param):
global refPt, cropping
if event == cv2.EVENT_LBUTTONDOWN:
refPt = [(x, y)]
cropping = True
elif event == cv2.EVENT_LBUTTONUP:
refPt.append((x, y))
cropping = False
cv2.rectangle(closeres, refPt[0], refPt[1], (0, 255, 0), 2)
cv2.imshow("image", closeres)
正如你可以从这段代码中看到的,它只在鼠标按钮松开后显示矩形,有没有一些方法可以在鼠标左键按下时绘制矩形?比如三角形的第一个点是他们点击的地方,第二个点是鼠标所在的地方?
编辑---
我跟着那个教程,把方法改成了这个-
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)
而且它每次鼠标移动都会绘制连续的矩形,而不是只有一个矩形改变大小,有人知道如何修复吗?
1条答案
按热度按时间noj0wjuj1#
我在谷歌上搜索了这个主题,没有找到你想要的工作示例。
另外,cxyzs7在评论中的答案是正确的,但链接的示例并没有达到您想要的效果。
由于
cv2.rectangle
直接覆盖输入图像,因此您必须在每个cv2.EVENT_LBUTTONUP
事件中提供一个新图像。只有当你在回调函数中将两个图像都定义为global
时,这才有效,否则image变量将是函数的本地变量(参见namespaces in python)。因此,我修改了OpenCV mouse handling demo的示例,以实现您想要的功能: