前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV-Python学习(11)—— OpenCV 图像几何形状绘制(cv.line、cv.circle、cv.rectangle、cv.ellipse)

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

作者头像
Rattenking
发布2022-11-07 14:47:21
2.1K0
发布2022-11-07 14:47:21
举报
文章被收录于专栏:Rattenking

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。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 学习目标
  • 2. 图像公共参数说明
    • 2.1 参数说明
      • 2.2 lineType 值说明
      • 3. 绘制直线 cv.line 函数说明
        • 3.1 cv.line() 函数使用
          • 3.2 参数说明
            • 3.3 注意
            • 4. 绘制圆形 cv.circle 函数说明
              • 4.1 cv.circle() 函数使用
                • 4.2 参数说明
                  • 4.3 注意
                  • 5. 绘制矩形 cv.rectangle 函数说明
                    • 5.1 cv.rectangle() 函数使用
                      • 5.2 参数说明
                        • 5.3 注意
                        • 6. 绘制椭圆 cv.ellipse 函数说明
                          • 6.1 cv.ellipse() 函数使用
                            • 6.2 参数说明
                            • 7. 直线绘制实例
                              • 7.1 实例代码
                                • 7.2 绘制结果
                                • 8. 圆形绘制实例
                                  • 8.1 实例代码
                                    • 8.2 绘制结果
                                      • 8.3 注意
                                      • 9. 绘制矩形实例
                                        • 9.1 实例代码
                                          • 9.2 绘制结果
                                          • 10. 绘制椭圆实例
                                            • 10.1 实例代码
                                              • 10.2 绘制结果
                                              • 11. 总结
                                              领券
                                              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档