OpenCV入门(四)快速学会OpenCV3画基本图形
1.画点
在OpenCV中,点分为2D平面中的点和3D平面中的点,区别就是3D中点多了一个z坐标。我们首先介绍2D中的点,坐标为整数的点可以直接用(x, y)代替,其中x是横坐标、y是纵坐标。
比如定义一个点:
pt=(100,200) #横坐标x=100,纵坐标y=200
画图时如果需要用到点,就可以直接用(x,y)作为参数代入。
比如有一个点的列表:
# 要画的点的坐标
points_list = [(160, 160), (136, 160), (150, 200), (200, 180), (120, 150), (145,
180)]
2.画矩形
全局函数rectangle用来通过对角线上的两个顶点绘制矩形,函数声明如下:
cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]] )
cv.rectangle(img, rec, color[, thickness[, lineType[, shift]]] )
其中,参数
img表示矩形所在的图像;
pt1表示矩形的一个顶点;
pt2表示矩形对角线上的另一个顶点;
color表示线条颜色(BGR)或亮度(灰度图像,grayscale image);
thickness表示组成矩形的线条的粗细程度,取负值时(如CV_FILLED)函数绘制填充了色彩的矩形;line_type表示线条的类型;shift表示坐标点的小数点位数。
import cv2 as cv
img = cv.imread("test.jpg")
img1=cv.rectangle(img,(10,10),(30,40),(255,0,0),2)
cv.imwrite("res.jpg",img1)#保存图片
cv.imshow("res", img1)
cv.waitKey(0)
在上述代码中,我们首先读取test.jpg,然后调用画矩形函数rectangle绘制一个矩形,其中点(10,10)是左上角顶点、点(30,40)是右下角顶点。颜色值是(255,0,0),是BGR形式,即蓝色分量值是255,因此显示的是蓝色。组成矩形的线条的粗细值是2。
画完后,我们保存到同目录下的res.jpg文件。
运行工程,结果如图所示。可以看到,窗口左上角的地方有一个蓝色边框的矩形。
3.画圆
全局函数circle用来绘制或填充一个给定圆心和半径的圆,函数声明如下:
cv.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
其中,参数
img表示输入的图像(圆画在这个图像上);
center表示圆心坐标;radius表示圆的半径;
color表示圆的颜色,是BGR形式,例如蓝色为Scalar(255,0,0);
thickness如果是正数就表示组成圆的线条的粗细程度,否则表示圆是否被填充;
lineType表示线的类型;
shift表示圆心坐标点和半径值的小数点位数。
import numpy as np
import cv2 as cv
img = cv.imread("test.jpg")
point_size = 10
point_color = (0, 0, 255) # BGR
thickness = -1
# 要画的点的坐标
points_list = [(16, 16), (35, 40) ]
for point in points_list:
cv.circle(img, point, point_size, point_color, thickness)
thickness = 4
# 画圆,圆心为:(60, 60),半径为:60,颜色为:point_color,实心线
cv.circle(img, (60, 60), 60, point_color, 0)
cv.namedWindow("image")
cv.imshow('image', img)
cv.waitKey (10000) # 显示 10000 ms 即 10s 后消失
cv.destroyAllWindows()
首先读取图片test.jpg,然后在for循环中,第一次画实心圆(thickness是-1),第二次画空心圆(thickness是4),并且组成圆的线条的粗细程度是4。接着画一个半径是60的圆。
所有圆都是在图片test.jpg上画的。
运行工程,结果如图所示。
4.画椭圆
函数ellipse用来绘制或者填充一个简单的椭圆弧或椭圆扇形。圆弧被ROI矩形所忽略,反走样弧线和粗弧线使用线性分段近似值,所有的角都以角度的形式给定。
该函数声明如下:
Ellipse(img, center, axes, angle, start_angle, end_angle, color, thickness=1,
lineType=8, shift=0)
其中,参数
img表示输入的图像(圆画在这个图像上);
center表示椭圆圆心坐标;
axes表示轴的长度;
angle表示偏转的角度;
start_angle表示圆弧起始角的角度;
end_angle表示圆弧终结角的角度;
color表示线条的颜色;
thickness表示线条的粗细程度;
line_type表示线条的类型;
shift表示圆心坐标点和数轴的精度。
下面看一个实例,绘制丰田车标。丰田车标是由3个椭圆组成的:两个横着,一个竖着。
import numpy as np
import cv2 as cv
img = cv.imread("test.jpg")
points_list = [ (45, 45), (45, 45),(45, 32) ]
size_list = [ (40, 25), (25, 11),(28, 12) ]
color = (0, 0, 255) # BGR
#绘制第一个椭圆,大椭圆,颜色为红色
cv.ellipse(img, points_list[0],size_list[0], 0, 0, 360, color, 5, 8);
#绘制第二个椭圆,竖椭圆
cv.ellipse(img,points_list[1], size_list[1], 90, 0, 360, color, 5, 8);
#绘制第三个椭圆,小椭圆(横)
cv.ellipse(img, points_list[2],size_list[2], 0, 0, 360, color, 5, 8);
cv.imshow("丰田", img);
cv.waitKey (10000) # 显示 10000 ms 即 10s 后消失
代码很简单,调用ellipse函数画3个椭圆。
运行工程,结果如图所示。
画圆和画椭圆的联合作战:
import numpy as np
import cv2 as cv
WINDOW_WIDTH=200 #定义窗口大小
def DrawFi1ledCirc1e(img,center ):
thickness = -1
lineType = 8
color = (0, 0, 255) # BGR
cv.circle(img, center, WINDOW_WIDTH//32, color, thickness, lineType)
def DrawEllipse( img, angle):
thickness = 2;
lineType = 8;
color = (255, 129, 0) # BGR
pt=(WINDOW_WIDTH // 2, WINDOW_WIDTH // 2)
size = (WINDOW_WIDTH // 4, WINDOW_WIDTH // 16)
cv.ellipse(img, pt,size, angle, 0, 360,color,thickness, lineType)
h=WINDOW_WIDTH
w=WINDOW_WIDTH
atomImage=np.zeros((h, w, 3), np.int8)
rookImage=np.zeros((h, w, 3), np.int8)
#绘制椭圆
DrawEllipse(atomImage, 90);
DrawEllipse(atomImage, 0);
DrawEllipse(atomImage, 45);
DrawEllipse(atomImage, -45);
#绘制圆心
DrawFi1ledCirc1e(atomImage,(WINDOW_WIDTH // 2,WINDOW_WIDTH // 2));
cv.imshow("result", atomImage);
cv.waitKey(0);
代码很简单,画了4个椭圆和一个实心圆,实心圆画在所有椭圆的圆心,也就是圆和4个椭圆的圆心是重合的。运行工程,结果如图所示。
5.画线段
在OpenCV中,函数line用来实现画线段,函数声明如下:
line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
其中,参数
img表示输入的图像(圆画在这个图像上);
pt1表示线段的起始点;
pt2表示线段的结束点;
color表示线段颜色;
thickness表示线段粗细;
lineType表示线段类型;
shift表示点坐标中的小数位数。
6.画多边形
在OpenCV中,函数polylines用来画多边形,函数声明如下:
polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
其中,参数
img表示输入的图像;
pts表示多边形点集;
isClosed表示绘制的多段线是否闭合,如果是闭合的,那么函数将从每条曲线的最后一个顶点到其第一个顶点绘制一条直线;
color表示多边形颜色;
thickness表示多段线边的厚度;
lineType表示线段类型;
shift表示点坐标中的小数位数。
画一个多边形:
import cv2
import numpy as np
img = cv2.imread("test.jpg")
Pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
cv2.polylines(img,[Pts],True,(0,0,255),2)
cv2.imshow("res", img);
cv2.waitKey(0);
首先读取test.jpg,然后定义一个点集数组Pts,接着调用polylines绘制多边形,最后显示出来。
7.填充多边形
在OpenCV中,除了绘制多边形之外,还可以填充多边形。函数fillPoly用来填充多边形,函数声明如下:
fillPoly(img, pts, color[, lineType[, shift[, offset]]])
其中,参数
img表示输入的图像;
pts表示多边形点集;
color表示多边形颜色;
lineType表示线段类型;
shift表示点坐标中的小数位数;
offset表示等高线所有点的偏移。
import numpy as np
import cv2 as cv
a = cv.imread("test.jpg")
triangle = np.array([ [10,30], [40,80], [10,90] ], np.int32)
cv.fillPoly(a, [triangle],(255,0,0))
cv.imshow("result", a)
cv.waitKey(0)
代码中,“[10,30],[40,80],[10,90]”为要填充的轮廓坐标,通过函数fillPoly填充多边形,填充的颜色是蓝色。
如图所示: