opencv用户绘图可见矩形

pu3pd22g  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(87)

我有这样的代码,用户可以选择一个矩形的图像裁剪它,但矩形是不可见的,而他们正在绘制它使它变得困难。有人知道我如何修改这样的代码,使其在我绘图时可见吗?
这是我的裁剪方法-

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)

而且它每次鼠标移动都会绘制连续的矩形,而不是只有一个矩形改变大小,有人知道如何修复吗?

noj0wjuj

noj0wjuj1#

我在谷歌上搜索了这个主题,没有找到你想要的工作示例。
另外,cxyzs7在评论中的答案是正确的,但链接的示例并没有达到您想要的效果。
由于cv2.rectangle直接覆盖输入图像,因此您必须在每个cv2.EVENT_LBUTTONUP事件中提供一个新图像。只有当你在回调函数中将两个图像都定义为global时,这才有效,否则image变量将是函数的本地变量(参见namespaces in python)。
因此,我修改了OpenCV mouse handling demo的示例,以实现您想要的功能:

import cv2
import numpy as np

drawing = False  # true if mouse is pressed
ix, iy = -1, -1

# mouse callback function
def draw_rectangle(event, x, y, flags, param):
    global ix, iy, drawing, img, original_img

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y

    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            img = original_img.copy()
            cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 0)

    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        img = original_img.copy()
        cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)
        original_img = img.copy()

original_img = np.zeros((512, 512, 3), np.uint8)
img = original_img.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", draw_rectangle)

while 1:
    cv2.imshow("image", img)
    k = cv2.waitKey(1) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

相关问题