【问题标题】:Multiple overlapping rectangle being drawn over an image when using cv2 to draw using mouse使用 cv2 使用鼠标绘制时在图像上绘制多个重叠矩形
【发布时间】:2023-01-03 04:33:11
【问题描述】:

我试图在图像上使用鼠标绘制矩形,使用 python 中的 openCV 包。每当我画一个矩形时,我都会得到多个相互重叠的矩形,而不是一个矩形。就像下面的图片

这是我的代码。请告诉我哪里出了问题以及需要更正的地方,以便我只得到 1 个矩形。

import cv2
import numpy as np

drawing  = False
ix,iy = -1, -1
img = cv2.imread('drawing_over_image/dog.jpg')
def draw(event, x, y, flags, params):

    global ix, iy, drawing

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

    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing:
            if ix < x and iy < y:
                cv2.rectangle(img=img, pt1=(ix,iy), pt2=(x,y), color=[255,0,0], thickness=1)
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img=img, pt1=(ix,iy), pt2=(x,y), color=[255,0,0], thickness=1)


if __name__ == "__main__":
    
    while True:
        cv2.imshow(winname='image', mat=img)
        cv2.setMouseCallback('image', draw)

        if cv2.waitKey(1) & 0xFF == 27:
            cv2.destroyAllWindows()
            break

    

【问题讨论】:

    标签: python-3.x opencv drawing


    【解决方案1】:

    它绘制了多个矩形,因为您在用户按下按钮后每次移动鼠标时都会绘制矩形。相反,您应该在事件完成时绘制,即当用户释放左键时。我修复了您的代码并添加了一个基本的参考图像,以便您在绘图时看到您的矩形。希望能帮助到你!

    import cv2
    import numpy as np
    
    drawing  = False
    ix,iy = -1, -1
    img = cv2.imread('drawing_over_image/dog.jpg')
    refimg = img.copy()
    def draw(event, x, y, flags, params):
    
        global ix, iy, drawing
    
        if event == cv2.EVENT_LBUTTONDOWN:
            ix,iy = x,y
            drawing = True
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing:
                if ix < x and iy < y:
                    cv2.rectangle(img=refimg, pt1=(ix,iy), pt2=(x,y), color=[255,0,0], thickness=1)
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            if ix < x and iy < y:
                cv2.rectangle(img=img, pt1=(ix,iy), pt2=(x,y), color=[255,0,0], thickness=1)
    
    
    
    if __name__ == "__main__":
        
        while True:
            cv2.imshow(winname='image', mat=refimg)
            cv2.setMouseCallback('image', draw)
            refimg = img.copy()
            if cv2.waitKey(1) & 0xFF == 27:
                cv2.destroyAllWindows()
                break
    

    输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多