首先需要
import cv2
import nump as np
创建画布
img = np.zeros((画布长度, 画布宽度 , 3), np.uint8)
直线
cv2.line(img, start, end, color, thickness)
img:想要绘制的那副图像(画布)
start:起始坐标,例如(0, 0)
end:终止坐标,例如(255, 255)
color:线的颜色,例如(255, 0, 0)
thickness:线的粗细,例如5
矩形
cv2.retangle(img, start, end, color, thickness)
start: 左上角坐标
end:右下角坐标
圆
cv2.circle(img, center, radius, color, thickness)
center:圆心坐标
radius:半径
thickness:线的粗细,若为-1则画出实心圆
椭圆
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType = LINE_8, shift = 0)
img:图像
center:圆心坐标
axes:长轴和短轴的长度,例如(80,40)
angle:偏转的角度
startAngle:圆弧起始角的角度
endAngle:圆弧终止角的角度
color:线条的颜色
thickness:线条的粗细程度
lineType:线条的类型
shift:圆心坐标点和轴的精度
多边形
#首先构造多边形点的数组
pst=np.arry([[x1,y1], [x2,y2]..., [xn,yn]], np.int32) # 必须是np.int32
#使用polylines函数画多边形
cv2.polylines(img, [pst], isClosed, color, thickness=None,lineType=None, shift=None)
# isClosed参数中,Ture表示闭合,False表示仅保留线段
添加文字
cv2.putText(img, text, center,lineType, size,color, thickness)
lineType:字体类型,推荐使用cv2.LINE_AA
size:字体大小
thickness:线条粗细
把鼠标当画笔
查看所有被支持的鼠标事件
import cv2
import numpy as np
events = [i for i in dir(cv2) if 'EVENT'in i]
print(events) # 输出可用的鼠标事件
其中,常用的几个:
0:cv2.EVENT_MOUSEMOVE 鼠标移动事件
1:cv.EVENT_LBUTTONDOWN 鼠标左键按下事件
2:cv.EVENT_RBUTTONDOWN 鼠标右键按下事件
3:cv.EVENT_MBUTTONDOWN 鼠标中键按下事件
4:cv.EVENT_LBUTTONUP 鼠标左键释放事件
5:cv.EVENT_RBUTTONUP 鼠标右键释放事件
6:cv.EVENT_MBUTTONUP 鼠标中键释放事件
7:cv.EVENT_LBUTTONBLCLK 鼠标左键双击事件
8:cv.EVENT_RBUTTONBLCLK 鼠标右键双击事件
9:cv.EVENT_MBUTTONBLCLK 鼠标中键双击事件
10:cv.EVENT_MOUSEWHEEL 滑动滚轮上下滚动
11:cv.EVENT_MOUSEHWHEEL 滑动滚轮左右滚动
简单的点击绘制图形
import cv2
import numpy as np
def draw_circle(event, x, y, flags, param):
if event == 0:# 鼠标拖拽
cv2.circle(img, (x, y), 5, (255, 0, 0), -1)
# 创建窗体并将窗体与回调函数绑定
img = np.zeros((255, 255, 3), np.uint8)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', draw_circle)
while(1):
cv2.imshow('image', img)
if cv2.waitKey(20)&0xFF == 27:
break
cv2.destroyAllWindows()
拖动鼠标绘制图形
import cv2
import numpy as np
drawing = False #鼠标未按下时为False,按下为True
mode = True #矩形和曲线的转换,键盘按下m转换
xi, yi = -1, -1 #记录按下的起始位置
def draw_rectangle(event, x, y, flags, param):
global drawing, xi, yi, mode
#当鼠标按下时
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
xi, yi = x, y
#当鼠标按下并拖拽时
elif event == cv2.EVENT_MOUSEMOVE and drawing:
if mode == True: #画矩形
cv2.rectangle(img, (xi, yi), (x, y), (123, 231, 165), -1)
else: #画圆形
cv2.circle(img, (x, y), 3, (123, 231, 165), -1)
#鼠标松开时,drawing改为False
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
img = np.zeros((300, 300, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)
while(1):
cv2.imshow('image',img)
k = cv2.waitKey(1)&0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break