1 绘制图形
利用OpenCV提供的绘制图形API可以轻松在图像上绘制各种图形, 比如直线, 矩形, 圆, 椭圆等图形.
1.1 画直线
- 画直线:cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
- img: 在哪个图像上画线
- pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
- color: 颜色
- thickness: 线宽,为正
- lineType: 线型.线型为-1, 4, 8, 16, 默认为8
- 越大越光滑,越小锯齿状越明显
- shift: 坐标缩放比例.
import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)
# 4的线宽,锯齿明显
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4)
# 16的线宽,光滑
cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 画矩形
- 画矩形:cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
- img: 在哪个图像上矩形
- pt1, pt2: 开始点, 结束点. 指定线的开始与结束位置
- color: 颜色
- thickness: 线宽
- 为正画的是空心矩形
- 为负画的是实心矩形
- lineType: 线型.线型为-1, 4, 8, 16, 默认为8
- 越大越光滑,越小锯齿状越明显
- shift: 坐标缩放比例.
import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)
# 为正,空心矩形
cv2.rectangle(img, (80, 100), (380, 380), (0, 255, 0), 5)
# 为负,实心矩形
cv2.rectangle(img, (80, 100), (380, 380), (0, 255, 0), -1)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.3 画圆
- 画圆:cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
- img 在哪个图像上圆
- center 圆心位置
- radius 圆的半径
- color 圆的颜色
- thickness 圆形轮廓的粗细
- 为正画的是空心圆
- 为负画的是实心圆
- lineType 圆边界类型
- shift 坐标缩放比例.
import cv2
import numpy as np
img = np.zeros((800, 800, 3), np.uint8)
# 为正,空心圆
cv2.circle(img, (320, 240), 100, (0, 0, 255), 5, 16)
# 为负,实心圆
# cv2.circle(img, (320, 240), 100, (0, 0, 255), -1, 16)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.4 画椭圆
-
画椭圆:cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
-
img 在哪个图像上画椭圆
-
center 椭圆的中心点
-
axes 长宽的一半
-
angle 角度
-
startAngle 从哪个角度开始
-
endAngle 从哪个角度结束
-
color 椭圆的颜色
-
thickness 椭圆形轮廓的粗细
- 为正画的是空心椭圆
- 为负画的是实心椭圆
-
lineType 椭圆边界类型
-
shift 坐标缩放比例.
-
import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)
# 画完整椭圆,空心
# cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, [0, 0, 255], 5, 16)
# 画1/4椭圆,空心
# cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 90, [0, 0, 255], 5, 16)
# 顺时针旋转45度,空心
# cv2.ellipse(img, (320, 240), (100, 50), 45, 0, 360, [0, 0, 255], 5, 16)
# 实心椭圆
cv2.ellipse(img, (320, 240), (100, 50), 0, 0, 360, [0, 0, 255], -1, 16)
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.5 画多边形
-
画多边形:cv2.polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
- img 哪个图像上画多边形
- pts 多边形的点集,必须是int32位,而且是三维的
- isClosed 形成的多边形是否闭合
- color 多边形的颜色
- thickness 多边形轮廓的粗细,线宽无法用负数填充,可以使用cv2.fillPoly( )填充
- lineType 多边形边界类型
- shift 坐标缩放比例.
import cv2 import numpy as np # 创建纯黑的背景图用来画图形 img = np.zeros((800, 800, 3), np.uint8) # 绘制多边形 # pts多边形的点集, 必须是int32位 pts = np.array([(250, 100), (150, 300), (50, 280)], np.int32) # 注意pts是3维的. # 不闭合多边形 # cv2.polylines(img, [pts], False, (0, 0, 255), 5) # 闭合多边形 # cv2.polylines(img, [pts], True, (0, 0, 255), 5) cv2.imshow('draw', img) cv2.waitKey(0) cv2.destroyAllWindows()
2 填充多边形
2.1 填充多边形
- 填充多边形:cv2.fillPoly(img, pts, color[, lineType[, shift[, offset]]])
- img 在哪个图像上填充
- pts 多边形的点集,必须是int32位,而且是三维的
- color 填充颜色
- lineType 边界类型
- shift 坐标缩放比例.
- offset 轮廓线上所有点的可选偏移量
填充一个:
import cv2
import numpy as np
# 创建纯黑的背景图用来画图形
img = np.zeros((800, 800, 3), np.uint8)
# 绘制多边形
# pts多边形的点集, 必须是int32位
pts = np.array([(250, 100), (150, 300), (50, 280)], np.int32)
# 注意pts是3维的.
# 不闭合多边形
# cv2.polylines(img, [pts], False, (0, 0, 255), 5)
# 闭合多边形
cv2.polylines(img, [pts], True, (0, 0, 255), 5)
# 填充多边形
cv2.fillPoly(img, [pts], (0, 0, 255))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
填充多个:
import cv2
import numpy as np
img = np.zeros((800, 800, 3), np.uint8)
area1 = np.array([[100,100],[150,100],[200,300],[50,300]])
area2 = np.array([[500,100],[700,100],[700,300],[500,300]])
cv2.fillPoly(img, [area1, area2], (255, 255, 255))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 填充凸多边形
填充凸多边形:
- cv2.fillConvexPloy(img, points, color[, lineType[, shift]])
- img 输入图像
- points 凸多边形的点集,二维
- color 填充颜色
- lineType 边界类型
- shift 坐标缩放比例.
import cv2
import numpy as np
img = np.zeros((800, 800, 3), np.uint8)
points = np.array([[400,100], [50,600], [200,600]])
cv2.fillConvexPoly(img, points, (255, 255, 255))
cv2.imshow('draw', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
附OpenCV目录:OpenCV总目录学习笔记
智科专业小白,写博文不容易,如果喜欢的话可以点个赞哦!