我正在尝试使用鼠标在 python 中使用 Opencv 作为输入绘制矩形。我从 opencv 文档制作了这段代码。绘制矩形时出现问题,即当您尝试从起点拖动矩形一直绘制到终点时。就像我在图片中展示的那样。
如何绘制干净的未填充矩形?在那里我可以看到绘制一个实际的矩形。就像我们在 Paint 中所做的那样
import cv2
import numpy as np
drawing = False
ix,iy = -1,-1
def draw_rect(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:
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),1)
img = np.zeros((512,512,3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_rect)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
谁能告诉我为什么会这样?有什么解决办法吗??
当你移动鼠标的同时,event == cv2.EVENT_MOUSEMOVE你也绘制了recatngle cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),1)。
尝试以下代码。
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()
Run Code Online (Sandbox Code Playgroud)
希望它能解决你的问题。干杯。
预期输出:
以上代码仅适用于黑色背景图像。但是我们可以为任何图像绘制矩形,所以 -
尝试以下代码。
# import the necessary packages
import cv2
import argparse
# now let's initialize the list of reference point
ref_point = []
def shape_selection(event, x, y, flags, param):
# grab references to the global variables
global ref_point, crop
# if the left mouse button was clicked, record the starting
# (x, y) coordinates and indicate that cropping is being performed
if event == cv2.EVENT_LBUTTONDOWN:
ref_point = [(x, y)]
# check to see if the left mouse button was released
elif event == cv2.EVENT_LBUTTONUP:
# record the ending (x, y) coordinates and indicate that
# the cropping operation is finished
ref_point.append((x, y))
# draw a rectangle around the region of interest
cv2.rectangle(image, ref_point[0], ref_point[1], (0, 255, 0), 2)
cv2.imshow("image", image)
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
# load the image, clone it, and setup the mouse callback function
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", shape_selection)
# keep looping until the 'q' key is pressed
while True:
# display the image and wait for a keypress
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
# press 'r' to reset the window
if key == ord("r"):
image = clone.copy()
# if the 'c' key is pressed, break from the loop
elif key == ord("c"):
break
# close all open windows
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
将文件另存为capture_events.py,为了测试,我们选择了位于同一目录下的演示图片。现在通过以下方式运行代码 -
python capture_events.py --image demo.jpg
预期输出:
如果出于某种原因我们想重新选择图像的任何部分,我们可以简单地按 'r' 以摆脱错误的选择以尝试新的选择。
希望,它会帮助更多。检查此要点,您可以在此基础上实现更多功能。干杯。
| 归档时间: |
|
| 查看次数: |
16095 次 |
| 最近记录: |