opencv 当使用cv2通过鼠标绘制时,在图像上绘制多个重叠矩形

hxzsmxv2  于 2023-01-05  发布在  其他
关注(0)|答案(2)|浏览(216)

我试着用python中的openCV包在图片上画矩形。当我画一个矩形时,我得到了多个相互重叠的矩形,而不是一个单独的矩形。如下图所示

这是我的代码。请告诉我哪里出错了,需要更正什么,这样我就只得到一个矩形。

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
3qpi33ja

3qpi33ja1#

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

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

输出:

thtygnil

thtygnil2#

编辑:
第18行和第28行中存在拼写错误mat=refimgimg
修改代码:

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, 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, pt1=(ix,iy), pt2=(x,y), color=[255,0,0], thickness=1)

cv2.setMouseCallback("Rectangle Window", draw_rectangle)
if __name__ == "__main__":
    while True:
        cv2.imshow(winname='image', img)        
        if cv2.waitKey(1) & 0xFF == 27:
            break

这是我如何使用树莓派4B在Linux上的

import cv2
import numpy as np

drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle.
ix,iy = -1,-1

# mouse callback function
def draw_circle(event,x,y,flags,param):
  global ix,iy,drawing,mode

  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),3)
            a=x
            b=y
            if a != x | b != y:
                 cv2.rectangle(img,(ix,iy),(x,y),(0,0,0),-1)
        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),2)

    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()

相关问题