前言
题目地址为:https://docs.opencv.org/4.x/db/d5b/tutorial_py_mouse_handling.html
题目内容:In our last example, we drew filled rectangle. You modify the code to draw an unfilled rectangle.
一、last example
完整代码如下:
import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
elif event == cv.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
else:
cv.circle(img,(x,y),5,(0,0,255),-1)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
效果图:
二、modify the code to draw an unfilled rectangle.
1.修改方法
第一步
首先将cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
和cv.circle(img,(x,y),5,(0,0,255),-1)
中最后一个参数修改,-1
代表填充满,如果最后一个参数修改为正整数例如将最后一个参数修改为5
,则代表的意思是绘制矩形时的线宽度为5
。
第二步
注释掉绑定鼠标移动时绘制矩形的事件。就是注释掉这一部分:
# elif event == cv.EVENT_MOUSEMOVE:
# if drawing == True:
# if mode == True:
# cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
# else:
# cv.circle(img,(x,y),5,(0,0,255),-1)
修改后的完整代码如下:
import numpy as np
import cv2 as cv
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix,iy = -1,-1
# mouse callback function
def draw_circle(event,x,y,flags,param):
global ix,iy,drawing,mode
if event == cv.EVENT_LBUTTONDOWN:
drawing = True
ix,iy = x,y
# elif event == cv.EVENT_MOUSEMOVE:
# if drawing == True:
# if mode == True:
# cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
# else:
# cv.circle(img,(x,y),5,(0,0,255),-1)
elif event == cv.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv.rectangle(img,(ix,iy),(x,y),(0,255,0),5)
else:
cv.circle(img,(x,y),5,(0,0,255),5)
img = np.zeros((512,512,3), np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv.destroyAllWindows()
效果图: