cv2绘图功能
基础图像
绘制直线
绘制直线
image=cv2.line(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 要在上面画线段的图像
pt1 线段的第 1 个点(x,y)
pt2 线段的第 2 个点(x,y)
color 线段的颜色
thickness 线段的粗细 thickness=-1 表示填充
lineType 线段的类型 产生线的算法,像素级别
shift 坐标精确到小数点后第几位
返回参数
img 画完线段的输入图像
"""
c1 = [0,0]
c2 = [255,255]
img=cv2.line(im0, c1, c2, [225, 0, 255], -1, cv2.LINE_AA)
绘制矩形
绘制矩形
image = cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
"""
img 要在上面画线段的图像
pt1 矩形的左上顶点(x,y)
pt2 矩形的右下顶点(x,y)
color 线段的颜色
thickness 线段的粗细 thickness=-1为填充颜色
lineType 线段的类型 产生线的算法
shift 坐标精确到小数点后第几位
"""
c1=(0,0)
c2=(200,200)
img=cv2.rectangle(im0, c1, c2, [225, 0, 255], 2, cv2.LINE_AA)
绘制圆形
绘制圆
image = cv2.circle(img, center, radius, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 要在上面画线段的图像
center 圆的圆心坐标(x,y)
radius 圆的半径
color 线段的颜色
thickness 线段的粗细 thickness=-1为填充颜色
lineType 线段的类型 产生线的算法
shift 坐标精确到小数点后第几位
"""
center=(100,100)
radius= 50
img=cv2.circle(img, center, radius,[255,0,255], 2, cv2.LINE_AA)
绘制椭圆
绘制椭圆
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 要在上面画线段的图像
center 椭圆圆的圆心坐标(x,y)
axes 椭圆的轴长 (长轴长度的一半, 短轴长度的一半)
angle 椭圆沿水平方向逆时针旋转的角度
startAngle 沿长轴顺时针方向开始显示的角度
endAngle 沿长轴顺时针结束显示的角度
color
thickness 线段的粗细 cv.FILLED
lineType 线段的类型 产生线的算法
shift 坐标精确到小数点后第几位
"""
center=(200,200)
axes= (200, 100)
angle = 0
startAngle = 0
endAngle = 0
cv2.ellipse(img, center, axes, angle, startAngle, endAngle, [255,0,255], 1, cv2.LINE_AA)
绘制多边形
绘制多边形
polylines(img, pts, isClosed, color, thickness=None, lineType=None, shift=None)
""" 输入参数
img 要在上面画线段的图像
pts 矢量的列表 pts.shape=(len,1,2)
isClosed true代表形成一个封闭的多边形,false代表只是连接各顶点,而非封闭
color
thickness 线段的粗细 cv.FILLED
lineType 线段的类型 产生线的算法
shift 坐标精确到小数点后第几位
"""
案例
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))
cv2.polylines(im0, [custom], isClosed=True, color=(255, 255, 0), thickness=2) # 多边形
写入文字
# 写入文字
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
"""输入参数
img 要在上面画线段的图像
text 要出入的文字
org 左下点坐标 注意是左下点
fontFace 字体类型
fontScale 字体大小
color 文字颜色
thickness 字体的粗细
lineType 线段的类型 产生线的算法
bottomLeftOrigin
"""
org
左下点坐标 注意是左下点
# 计算文本的宽高,baseLine
cv2.putText 一般和cv2.getTextSize 合用
retval, baseLine = cv2.getTextSize(text, fontFace, fontScale, thickness)
"""输入参数
text 需要写入的文本
fontFace 字体类型
fontScale 字体大小
thickness 字体粗细
返回参数
retval 字体的长、宽
baseLine 基线的高度
"""
# 案例
# 将文字输出到矩形框里面
text='xinao1234'
t_size,_ = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, thickness=3)
x1y1=(0,0)
x2y2=x1y1[0]+t_size[0],x1y1[1]-t_size[1]
# putText的输入坐标是左下点 故y2=x1y1[1]-t_size[1]
cv2.rectangle(im0, x1y1, x2y2, [255, 255, 255], -1, cv2.LINE_AA)
cv2.putText(img,text,x1y1,cv2.FONT_HERSHEY_SIMPLEX,1,[0, 0, 0], thickness=3, lineType=cv2.LINE_AA)
鼠标为画笔
def mouse_envent_and_plot(img):
xylist = []
xylist2 = []
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
xy = "%d,%d" % (x, y)
cv2.circle(img, (x, y), 2, (0, 0, 255), thickness=-1)
cv2.putText(img, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
1.0, (0, 0, 0), thickness=2)
cv2.imshow("image", img)
xylist.extend([x / 768, y / 1024])
xylist2.extend([x, y])
def on_Mouse():
return cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN) # 回调函数绑定时间
img = cv2.resize(img, (768, 1024))
cv2.namedWindow("image")
cv2.resizeWindow('image', 700, 900) # 自己设定窗口图片的大小
on_Mouse()
import numpy as np
import cv2
mode = 0
# 创建回调函数
def OnMouseAction(event, x, y, flags, param):
global x1, y1
img = img1
if mode == 0 and event == cv2.EVENT_LBUTTONDOWN:
print("左键点击")
cv2.line(img, (0, 0), (x, y), (255, 255, 0), 2)
if mode == 1 and event == cv2.EVENT_LBUTTONDOWN:
print("左键点击1")
x1, y1 = x, y
elif mode == 1 and event == cv2.EVENT_MOUSEMOVE and flags == cv2.EVENT_FLAG_LBUTTON:
print("左鍵拖曳1")
cv2.rectangle(img2, (x1, y1), (x, y), (0, 255, 0), -1)
img1 = np.zeros((500, 500, 3), np.uint8)
img2 = np.zeros((500, 500, 3), np.uint8)
cv2.putText(img1, '1', (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0))
cv2.putText(img2, '2', (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 4, (255, 0, 0))
cv2.namedWindow('image1')
cv2.namedWindow('image2')
cv2.setMouseCallback('image1', OnMouseAction)
while (1):
cv2.imshow('image1', img1)
cv2.imshow('image2', img2)
# cbf()
k = cv2.waitKey(1)
if k == ord('l'):
mode = 0
elif k == ord('t'):
mode = 1
elif k == ord('q'):
break
cv2.destroyAllWindows()