目标
- 学习使用OpenCV 绘制不同几何图形
- 你将会学习到这些函数:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText() 等。
代码
上面所有的这些绘图函数需要设置下面这些参数:
- img:你想要绘制图形的那幅图像。
- color:形状的颜色。以BGR为例,需要传入一个元组,例如:(255,0,0)代表蓝色。【因为opencv使用的是BGR】对于灰度图只需要传入灰度值。
- thickness:线条的粗细。如果给一个闭合图形设置为-1,那么这个图形就会被填充。默认值是1.
- linetype:线条的类型,8 连接,抗锯齿等。默认情况是8 连接。cv2.LINE_AA为抗锯齿,这样看起来会非常平滑。
6.1 画线
要画一条线,你只需要告诉函数这条线的起点和终点。我们下面会画一条从左上方到右下角的蓝色线段。
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
# Draw a diagonal blue line with thickness of 5 px
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
结果:
6.2 画矩形
要画一个矩形,你需要告诉函数的左上角顶点和右下角顶点的坐标。这次我们会在图像的右上角画一个绿色的矩形。
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
# Draw a green rectangle with thickness of 3 px
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
结果:
6.3 画圆
要画圆的话,只需要指定圆形的中心点坐标和半径大小。我们在上面的矩形中画一个圆
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
cv.circle(img,(447,63), 63, (0,0,255), -1)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
结果:
6.4 画椭圆
画椭圆比较复杂,我们要多输入几个参数。一个参数是中心点的位置坐标。下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧延顺时针方向起始的角度和结束角度,如果是0 到360,就是整个椭圆。查看cv2.ellipse() 可以得到更多信息。
下面的例子是在图片的中心绘制半个椭圆。
代码:
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
6.5 画多边形
画多边形,需要指点每个顶点的坐标。用这些点的坐标构建一个大小等于行数X1X2 的数组,行数就是点的数目。这个数组的数据类型必须为int32。这里画一个黄色的具有四个顶点的多边形。
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
pts=np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts=pts.reshape((-1,1,2))
# 这里reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
cv.polylines(img,[pts],True,(0,255,255))
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
注意:cv2.polylines() 可以被用来画很多条线。只需要把想要画的线放在一
个列表中,将这个列表传给函数就可以了。每条线都会被独立绘制。这会比用
cv2.line() 一条一条的绘制要快一些。
6.6 在图片上添加文字
要在图片上绘制文字,你需要设置下列参数:
- 你要绘制的文字
- 你要绘制的位置
- 字体类型(通过查看cv2.putText() 的文档找到支持的字体)
- 字体的大小
- 文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用
linetype=cv2.LINE_AA。
在图像上绘制白色的OpenCV。
import cv2 as cv
import numpy as np
# Create a black image
img=np.zeros((512,512,3), np.uint8)
font=cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2)
cv.imshow("img", img)
cv.waitKey(0)
cv.destroyAllWindows()
警告:所有的绘图函数的返回值都是None, 所以不能使用img =cv2.line(img,(0,0),(511,511),(255,0,0),5)。
做了点笔记
搬运自OpenCV-Python-Tutorial-中文版pdf 段力辉 译