OpenCV-Python学习(11)—— OpenCV 图像几何形状绘制(cv.line、cv.circle、cv.rectangle、cv.ellipse)

2022-11-07 14:47:21 浏览数 (2)

1. 学习目标

  1. 学会使用 cv.line 绘制一条线;
  2. 学会使用 cv.circle 绘制圆;
  3. 学会使用 cv.rectangle 绘矩形;
  4. 学会使用 cv.ellipse 绘椭圆。

2. 图像公共参数说明

2.1 参数说明

参数

说明

img

表示输入图像,允许单通道灰度图像或多通道彩色图像。

color

表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。

thickness

表示绘制直线的粗细,默认值 1px,-1 表示内部填充。

lineType

表示绘制直线的线性,默认为 LINE_8。

shift

表示点坐标的小数位数,默认为 0。

2.2 lineType 值说明

描述

cv.FILLED

表示内部填充(实心图形)。

cv.LINE_4

表示 4 邻接线型。

cv.LINE_8

表示 8 邻接线型。

cv.LINE_AA

表示抗锯齿线型,图像更平滑。

3. 绘制直线 cv.line 函数说明

3.1 cv.line() 函数使用
代码语言:javascript复制
cv.line(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
3.2 参数说明

参数

说明

img

表示输入图像,允许单通道灰度图像或多通道彩色图像。

pt1

表示线段第一个点的坐标,(x1, y1)。

pt2

表示线段第二个点的坐标,(x2, y2)。

color

表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。

thickness

表示绘制直线的粗细,默认值 1px,-1 表示内部填充。

lineType

表示绘制直线的线性,默认为 LINE_8。

shift

表示点坐标的小数位数,默认为 0。

3.3 注意
  1. 绘图操作会直接对传入的图像 img 进行修改,是否接受函数返回值都可以。
  2. 在绘制直线时不能选择填充线型 cv.FILLED ,否则会报错。
  3. 图像尺寸较小时,LINE_4 线型存在明显的锯齿,LINE_AA 线型更加平滑。
  4. 图像尺寸较大时,则线型的影响并不大,推荐采用默认值 LINE_8。
  5. 如果设置了 thickness,关键词 lineType 可以省略;如果没有设置 thickness,则关键词 lineType 不能省略,否则输入的线型参数会被错误地解释为线宽。

4. 绘制圆形 cv.circle 函数说明

4.1 cv.circle() 函数使用
代码语言:javascript复制
cv.circle(img, center, radius, color[, thickness=1, lineType=LINE_8, shift=0]) → img
4.2 参数说明

参数

说明

img

表示输入图像,允许单通道灰度图像或多通道彩色图像。

center

表示圆心点的坐标,(x, y) 格式的元组。

radius

表示圆的半径,整数。

color

表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。

thickness

表示绘制直线的粗细,默认值 1px,-1 表示内部填充。

lineType

表示绘制直线的线性,默认为 LINE_8。

shift

表示点坐标的小数位数,默认为 0。

4.3 注意
  1. 在单通道的灰度图像上只能绘制灰度线条,不能绘制彩色线条 。但是,线条颜色 color 可以是标量 b,也可以是元组 (b,g,r),都会被解释为灰度值 b。元组中的后两个通道的参数是无效的。

5. 绘制矩形 cv.rectangle 函数说明

5.1 cv.rectangle() 函数使用
代码语言:javascript复制
cv.rectangle(img, pt1, pt2, color[, thickness=1, lineType=LINE_8, shift=0]) → img
5.2 参数说明

参数

说明

img

表示输入图像,允许单通道灰度图像或多通道彩色图像。

pt1

表示矩阵第一个点的坐标,(x1, y1) 格式的元组。

pt2

表示与 pt1 成对角的矩阵第二个点的坐标,(x2, y2) 格式的元组。

color

表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。

thickness

表示绘制直线的粗细,默认值 1px,-1 表示内部填充。

lineType

表示绘制直线的线性,默认为 LINE_8。

shift

表示点坐标的小数位数,默认为 0。

5.3 注意
  1. 使用rec参数绘制矩形,r.tl() 和 r.br() 是矩形的对角点

6. 绘制椭圆 cv.ellipse 函数说明

6.1 cv.ellipse() 函数使用
代码语言:javascript复制
cv.ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness=1, lineType=LINE_8, shift=0]) → img
6.2 参数说明

参数

说明

img

表示输入图像,允许单通道灰度图像或多通道彩色图像。

center

表示椭圆的圆心点的坐标,(x, y) 格式的元组。

axes

表示椭圆的轴长,格式为 (长轴长度的一半, 短轴长度的一半) 格式的元组。

angle

表示椭圆沿水平方向逆时针旋转的角度。

startAngle

表示沿长轴顺时针方向开始显示的角度。

endAngle

表示沿长轴顺时针结束显示的角度。

color

表示绘制直线的颜色,(b,g,r) 格式的元组,或者表示灰度值的标量。

thickness

表示绘制直线的粗细,默认值 1px,-1 表示内部填充。

lineType

表示绘制直线的线性,默认为 LINE_8。

shift

表示点坐标的小数位数,默认为 0。

7. 直线绘制实例

7.1 实例代码
代码语言:javascript复制
import cv2 as cv

def draw_line():
  img = cv.imread("./images/messi5.jpg")
  h,w,c = img.shape
  img = cv.line(img,(0,0),(w*2,h*2),(255,0,0),10)
  img = cv.line(img,(10,int(h/2)),(w - 10,int(h / 2)),(0,255,0),5)
  cv.imshow('line', img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  draw_line()
7.2 绘制结果

8. 圆形绘制实例

8.1 实例代码
代码语言:javascript复制
import cv2 as cv
import numpy as np

def draw_circle():
  img = np.zeros((100,500,3),np.uint8)
  img[:] = 255
  # 绘制默认1px边框的圆
  cv.circle(img,(50,50),25,(255,0,0))
  # 绘制填充圆 thickness
  cv.circle(img,(150,50),25,(255,0,0),-1)
  # 绘制填充圆 lineType
  cv.circle(img,(250,50),25,(0,255,0),lineType=cv.FILLED)
  # 绘制边框10px的圆
  cv.circle(img,(350,50),25,(255,0,0),10)
  # 绘制平滑边框10px的圆
  cv.circle(img,(450,50),25,(255,0,0),10,cv.LINE_AA)

  cv.imshow('circle', img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  draw_circle()
8.2 绘制结果
8.3 注意
  1. 在绘制圆形时不能选择填充线型 cv.FILLED,无效。

9. 绘制矩形实例

9.1 实例代码
代码语言:javascript复制
import cv2 as cv
import numpy as np

def draw_rectangle():
  img = np.zeros((200,500,3),np.uint8)
  img[:] = 255
  # 绘制默认1px边框的矩形
  cv.rectangle(img,(10,10),(50,60),(0,0,255))
  # 绘制10px边框的矩形
  cv.rectangle(img,(110,10),(150,60),(0,0,255),10)
  # 绘制填充矩形 thickness
  cv.rectangle(img,(210,10),(250,60),(0,0,255),-1)
  # 绘制平滑边框10px的矩形
  cv.rectangle(img,(310,10),(350,60),(0,0,255),10,cv.LINE_AA)

  cv.imshow('rectangle', img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  draw_rectangle()
9.2 绘制结果

10. 绘制椭圆实例

10.1 实例代码
代码语言:javascript复制
import cv2 as cv
import numpy as np

def draw_ellipse():
  img = np.zeros((200,500,3),np.uint8)
  img[:] = 255
  # 绘制默认1px边框的椭圆
  cv.ellipse(img,(50,50),(50,30),0,0,360,(255,0,0))
  # 绘制填充椭圆 thickness
  cv.ellipse(img,(150,50),(50,30),0,0,360,(255,0,0),-1)
  # 绘制10px边框的椭圆
  cv.ellipse(img,(260,50),(50,30),0,0,360,(255,0,0),10)
  # 绘制平滑边框10px的矩形
  cv.ellipse(img,(380,50),(50,30),0,0,360,(255,0,0),10,cv.LINE_AA)
  # 椭圆旋转30度
  cv.ellipse(img,(380,150),(50,30),30,0,360,(255,0,0),10,cv.LINE_AA)
  # 半椭圆绘制
  cv.ellipse(img,(260,150),(50,30),0,0,180,(255,0,0),10)
  # 绘制一个圆
  cv.ellipse(img,(150,150),(30,30),0,0,360,(255,0,0),10)
  # 绘制半圆
  cv.ellipse(img,(50,150),(30,30),0,180,360,(255,0,0),10)

  cv.imshow('ellipse', img)
  cv.waitKey(0)
  cv.destroyAllWindows()

if __name__ == "__main__":
  draw_ellipse()
10.2 绘制结果

11. 总结

  1. 绘制弧形使用椭圆绘制函数;
  2. 填充图形使用 thickness 的值为 -1
  3. 绘制图形不能超出图像,超出部分直接按照图像边缘截取;
  4. 图像尺寸较小时,LINE_4 线型存在明显的锯齿,LINE_AA 线型更加平滑;
  5. 图像尺寸较大时,则线型的影响并不大,推荐采用默认值 LINE_8。

0 人点赞