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

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() 函数使用
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() 函数使用
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() 函数使用
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() 函数使用
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 实例代码
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 实例代码
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 实例代码
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 实例代码
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。
  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
OpenCV是一款非常强大的计算机视觉库,其中包含了很多功能强大的图像处理和计算机视觉算法。而在这个系列的第三篇文章中,我们将重点介绍如何在OpenCV绘制图形和文本。 OpenCV绘制图形的函数包括cv2.line(直线),cv2.rectangle(矩形),cv2.circle(圆),cv2.ellipse(椭圆)和cv2.putText(文本)。这些函数的使用非常简单,只需要指定图像,开始点和结束点(或中心点和半径),颜色和线宽即可。 例如,我们可以使用cv2.rectangle函数在图像绘制一个矩形: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 cv2.rectangle(img,(384,0),(510,128),(0,255,0),3) # 绘制矩形 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们首先创建了一个512x512的黑色图像,然后使用cv2.rectangle函数在图像绘制了一个矩形,并将其显示出来。在这里,矩形的左上角坐标是(384,0),右下角坐标是(510,128),颜色是绿色(0,255,0),线宽为3。 除了绘制图形,我们也可以使用cv2.putText函数在图像绘制文本。这个函数的使用也非常简单,只需要指定图像,文本内容,位置,字体,字体大小和颜色即可。 例如,我们可以使用cv2.putText函数在图像上写入一个“Hello World!”的文本: ``` import cv2 import numpy as np img = np.zeros((512,512,3), np.uint8) # 创建一个黑色的图像 font = cv2.FONT_HERSHEY_SIMPLEX # 设置字体 cv2.putText(img,'Hello World!',(10,500), font, 1,(255,255,255),2,cv2.LINE_AA) # 绘制文本 cv2.imshow("image",img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个例子中,我们使用cv2.putText函数在左下角绘制了一个“Hello World!”的文本,并将其显示出来。在这里,我们首先选取了字体类型为cv2.FONT_HERSHEY_SIMPLEX,然后指定了文本的位置(10,500),字体大小为1,颜色为白色(255,255,255),线宽为2,并且使用了cv2.LINE_AA参数,以实现更好的文本渲染效果。 综上所述,OpenCV中可以很方便地对图像进行绘制和文本处理,这对于图像处理和计算机视觉应用来说是非常重要的一步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rattenking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值