OpenCV提供了许多绘制图像的API,可以在图像上绘制各种图形,例如直线,矩形,圆,椭圆等图形。
一、画直线
利用API line(img, pt1, pt2, color, thickness, lineType, shift)可以绘制直线。
其中img:表示在哪个图像上画直线
pt1,pt2:开始点和结束点,用于指定线的开始和结束位置。(按照坐标点的形式写入,用元组的格式,先列后行)
color:指定直线的颜色。(颜色的形式也为BGR的元组形式)
thickness:指定线宽。(数值越大,线条越粗)
lineType:指定线性,线性为0, 4, 8, 16,默认为8。(只有实线一种类型,数字越大,线越光滑)
shift:坐标缩放比例。(一般可以不用写)
示例代码如下:
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8) # 创建一个全黑的背景图
cv2.line(img, (10, 20), (300, 400), (0, 0, 255), 5, 4) # 画红色的线
cv2.line(img, (80, 100), (380, 480), (0, 0, 255), 5, 16)
cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
二、画矩形
画矩形的API中的参数与画直线的API一样,比较简单。
示例代码如下:
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8) # 创建一个全黑的背景图
cv2.rectangle(img, (20, 50), (380, 380), (0, 255, 0), 5, 16) # 用绿色画框
cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
三、画圆
画圆我们使用以下API:circle(img, center, radius, color, thickness, lineType, shift)
相比较于画直线与矩形,将起始点和终点改为中心点和半径,其他参数相同。
示例代码如下:
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8) # 创建一个全黑的背景图
# Opencv读取的行和列与numpy相反
cv2.circle(img, (320, 240), 50, (255, 0, 0), 5, 16) # 在中心点用蓝色画圆
cv2.imshow("line", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
四、绘制椭圆
使用API cv.ellipse(img, center, axes, angle, startAngel, endAngle, color, thickness, lineType, shift)
其中img, center, color, thickness, lineType, shift与上述参数要求一样。
Opencv画椭圆,相当于将椭圆锁在一个矩形里面,沿着切线画。
axes为axis的复数,需要填写椭圆x轴与y轴长度的一半。
angle:椭圆可以任意旋转角度,可以是横着的也可以是竖着的。(默认是0°,且逆时针旋转)
startAngle:从哪个角度开始
endAngle:从哪个角度结束°
开始角度和结束角度可以设置画取椭圆的一部分,而不是整个椭圆。从0°~360°则为一个完整的椭圆。
当把axes的两个数值改为相等,则相当于画圆形。
示例代码如下:
import cv2
import numpy as np
img = np.zeros((480, 640, 3), np.uint8) # 创建一个全黑的背景图
img2 = np.zeros((480, 640, 3), np.uint8)
img3 = np.zeros((480, 640, 3), np.uint8)
cv2.ellipse(img, (320, 240), (80, 40), 0, 0, 360, (0, 255, 0), 5, 16)
cv2.ellipse(img2, (320, 240), (80, 40), 90, 0, 360, (0, 255, 0), 5, 16)
cv2.ellipse(img3, (320, 240), (80, 40), 0, 0, 180, (0, 255, 0), 5, 16)
# Opencv读取的行和列与numpy相反
cv2.imshow("line", img)
cv2.imshow("line2", img2)
cv2.imshow("line3", img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如下:
通过改变不同的角度值可以获取不同的椭圆类型。