opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)

OpenCV 中的绘图函数

  • 学习使用 OpenCV 绘制不同几何图形
  • 相关函数:cv2.line(),cv2.circle(),cv2.rectangle(),cv2.ellipse(),cv2.putText() 等。

代码

上面所有的这些绘图函数需要设置下面这些参数:

  • img:你想要绘制图形的那幅图像。
  • color:形状的颜色。以 RGB 为例,需要传入一个元组,例如:(255,0,0)代表蓝色。对于灰度图只需要传入灰度值。
  • thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.
  • linetype:线条的类型,8 连接,抗锯齿等。默认情况是 8 连接。cv2.LINE_AA为抗锯齿,这样看起来会非常平滑。

注意:
所有的绘图函数的返回值都是 None ,所以不能使用 img = cv2.line(img,(0,0),(511,511),(255,0,0),5)

一、线

要画一条线,你只需要告诉函数这条线的起点和终点

line(img, pt1, pt2, color, thickness=1, lineType=8, shift=0);

  • img: 要绘制线段的图像。
  • pt1: 线段的起点。 pt2: 线段的终点。
  • color: 线段的颜色。
  • thickness: 线条的宽度。默认值为1
  • lineType: 线段的类型。可以取值8, 4 和LINE_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。
  • shift: 坐标点小数点位数。
import numpy as np
import cv2
import matplotlib.pyplot as plt

#创建一个黑色图片 np.zeros()返回一个填充为0的数组
img1 = np.zeros((512,512,3),np.uint8)
img2 = np.zeros((512,512,3),np.uint8)

关于shift参数

参考这位博主的博客:https://blog.csdn.net/yixieling4397/article/details/80173290

shift参数,实际上是将坐标的小数点向前移动几位。

注意左上角的蓝色线,那就是shift=5出现的连线,那么此时大家就知道,原来shift参数,就是将坐标的小数点向前移动几位,其实就是缩小倍数。
opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第1张图片

#画一条5px粗的蓝色对角线im_show()
cv2.line(img1,(0,0),(511,511),(0,0,255),5,cv2.LINE_AA,0)
cv2.line(img2,(0,0),(511,511),(255,0,0),5,cv2.LINE_AA,3)

# 对比不同shift变量的效果
plt.figure(figsize = (10, 10))
plt.subplot(1, 2, 1), plt.imshow(img1), plt.axis('off'), plt.title("shift=0")
plt.subplot(1, 2, 2), plt.imshow(img2), plt.axis('off'), plt.title("shift=3")

二、椭圆

想要画一个矩形,你需要确定函数的左上角顶点和右下角顶点的坐标。这次我们会在图像右上角画一个绿色的矩形。

void ellipse(img, center, axes,angle, startAngle, endAngle, color, thickness=1, lineType=8, shift=0);

  • img: 要绘制椭圆的图像。
  • center: 椭圆中心点坐标。
  • axes: 椭圆位于该Size决定的矩形内。(即定义长轴和短轴)。
  • angle: 椭圆旋转角度。
  • startAngle: 椭圆开始绘制时角度。
  • endAngle: 椭圆绘制结束时角度。(若绘制一个完整的椭圆,则startAngle=0, endAngle = 360)。
  • color: 椭圆的颜色。
  • thickness: 绘制椭圆线粗。负数表示全部填充。
    opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第2张图片
import numpy as np
import cv2
import matplotlib.pyplot as plt

#创建一个黑色图片 np.zeros()返回一个填充为0的数组
img = np.zeros((512,512,3),np.uint8)

#画椭圆——需要输入中心点位置,长轴和短轴的长度,椭圆沿逆时针选择角度,椭圆沿顺时针方向起始角度和结束角度
cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)

plt.imshow(img),plt.axis('off'), plt.title("shift=0")

三、矩形

要画一个矩形,你需要告诉函数的左上角顶点和右下角顶点的坐标。

rectangle(img, pt1, pt2,color, thickness=1, lineType=8, shift=0);

  • pt1: 矩形的左上角坐标。
  • pt2: 矩阵的右下角坐标。
    opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第3张图片
import numpy as np
import cv2
import matplotlib.pyplot as plt

#创建一个黑色图片 np.zeros()返回一个填充为0的数组
img = np.zeros((512,512,3),np.uint8)

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

plt.imshow(img)

四、圆和点

要画圆的话,只需要指定圆形的中心点坐标和半径大小。

circle(img, center, radius, color, thickness=1, lineType=8, shift=0);

  • center: 圆心坐标。
  • radius: 半径
    opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第4张图片
import numpy as np
import cv2
import matplotlib.pyplot as plt


#创建两个黑色图片 np.zeros()返回一个填充为0的数组
img1 = np.zeros((512,512,3),np.uint8)
img2 = np.zeros((512,512,3),np.uint8)

#画圆
cv2.circle(img1,(100,150),63,(0,0,255),thickness=-1)  #线型-1表示填充
# 画点
cv2.circle(img2, (100, 100), 5, (255, 0, 255), thickness=-1)

# 对比不同shift变量的效果
plt.figure(figsize = (10, 10))
plt.subplot(1, 2, 1), plt.imshow(img1), plt.axis('off')
plt.subplot(1, 2, 2), plt.imshow(img2), plt.axis('off')

五、多边形

画一个多边形,需要确定每个顶点的坐标,用这些点的坐标构建一个大小等于函数 Row x1x2的数组,行数就是点的数目。这个数组类型必须是int32.

注意

  • 如果第三个参数是False ,我们得到的多边形是不闭合的(首尾不相连)。

  • cv2.polylines() 可以被用来画很多条线。只要把想要画的线放在一个列表中,将这个列表传给函数就行了。每条线都会被独立绘制,这比用cv2.line()一条一条的绘制要快多了。
    opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第5张图片

import numpy as np
import cv2
import matplotlib.pyplot as plt

#创建一个黑色图片 np.zeros()返回一个填充为0的数组
img = np.zeros((512,512,3),np.uint8)

pts=np.array([[100,150],[20,30],[400,20],[300,300]], np.int32)
pts=pts.reshape((-1,1,2))  # 这里 reshape 的第一个参数为-1, 表明这一维的长度是根据后面的维度的计算出来的。
cv2.polylines(img,[pts],True,(255,0,255),cv2.LINE_AA)  # 如果第三个参数是 False,我们得到的多边形是不闭合的(首尾不相连)。

plt.imshow(img)

六、图片标注文字

在图片上绘制文字,你需要设置下列参数:

  • 你要绘制的文字
  • 你要绘制的位置
  • 字体的类型(通过查看 cv2.putText() 的文档找到支持的字体)
  • 字体的大小
  • 字体的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用linetype = cv2.LINE_AA
    opencv-python:03_OpenCV 中的绘图函数(点,线,圆,矩阵,多边形,添加文字)_第6张图片
import numpy as np
import cv2
import matplotlib.pyplot as plt

#创建一个黑色图片 np.zeros()返回一个填充为0的数组
img = np.zeros((512,512,3),np.uint8)

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'Opencv',(10,300),font,4,(255,255,255),2,cv2.LINE_AA)

plt.imshow(img)

你可能感兴趣的:(python,opencv)