opencv进阶02-在图像上绘制多种几何图形

OpenCV 提供了方便的绘图功能,使用其中的绘图函数可以绘制直线、矩形、圆、椭圆等多种几何图形,还能在图像中的指定位置添加文字说明。

OpenCV 提供了绘制直线的函数 cv2.line()、绘制矩形的函数 cv2.rectangle()、绘制圆的函数cv2.circle()、绘制椭圆的函数cv2.ellipse()、绘制多边形的函数 cv2.polylines()、在图像内添加文字的函数 cv2.putText()等多种绘图函数。

这些绘图函数有一些共有的参数,主要用于设置源图像、颜色、线条属性等。下面对这些共有参数做简单的介绍。

  • img:在其上面绘制图形的载体图像(绘图的容器载体,也称为画布、画板)。
  • color:绘制形状的颜色。通常使用 BGR 模型表示颜色,例如,(0, 255, 0)表示绿色。对于灰度图像,只能传入灰度值。需要注意,颜色通道的顺序是 BGR,而不是 RGB。
  • thickness:线条的粗细。默认值是 1,如果设置为-1,表示填充图形(即绘制的图形是实心的)。
  • lineType:线条的类型,默认是 8 连接类型。lineType 参数的值及说明如表 19-1 所示。

在这里插入图片描述

  • shift:数据精度。该参数用来控制数值(例如圆心坐标等)的精度,一般情况下不需要设置。

绘制直线

OpenCV 提供了函数 cv2.line()用来绘制直线(线段)。该函数的语法格式为:

img = cv2.line( img, pt1, pt2, color[, thickness[, lineType ]])

式中:

  • 参数 img、color、thickness、lineType 的含义如前面的说明所示。
  • pt1 表示线段的第 1 个点(起点)。
  • pt2 表示线段的第 2 个点(终点)。

示例:使用 cv2.line()函数在一个黑色背景图像内绘制三条线段。

import numpy as np
import cv2
n = 300  # 图像尺寸# 创建一个空白的彩色图像,尺寸为(n+1) x (n+1)3通道(RGB)
img = np.zeros((n+1, n+1, 3), np.uint8)# 在图像上绘制蓝色直线,起点为(0,0),终点为(n,n),线宽为3
img = cv2.line(img, (0, 0), (n, n), (255, 0, 0), 3)# 在图像上绘制绿色直线,起点为(0,100),终点为(n,100),线宽为1
img = cv2.line(img, (0, 100), (n, 100), (0, 255, 0), 1)# 在图像上绘制红色直线,起点为(100,0),终点为(100,n),线宽为6
img = cv2.line(img, (100, 0), (100, n), (0, 0, 255), 6)winname = 'line-demo'  # 窗口名称# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)# 在窗口中显示图像
cv2.imshow(winname, img)# 等待键盘按键,0表示无限等待
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:

在这里插入图片描述

绘制矩形

OpenCV 提供了函数 cv2.rectangle()用来绘制矩形。该函数的语法格式为:

img = cv2.rectangle( img, pt1, pt2, color[, thickness[, lineType]] )

式中:

  • 参数 img、color、thickness、lineType 的含义如前面的说明所示。
  • pt1 为矩形顶点。
  • pt2 为矩形中与 pt1 对角的顶点。

使用函数 cv2.rectangle()在一个白色背景图像内绘制一个实心矩形和空心矩形。

代码如下:

import numpy as np
import cv2n = 300  # 图像尺寸# 创建一个白色背景的彩色图像,尺寸为n x n,3通道(RGB)
img = np.ones((n, n, 3), np.uint8) * 255# 在图像上绘制填充的红色矩形,左上角坐标为(50, 50),右下角坐标为(n-100, n-50),颜色为红色,厚度为-1表示填充, 0表示不填充
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)winname = 'rect-shixin'  # 窗口名称# 创建一个窗口并设置窗口名字
cv2.namedWindow(winname)# 在窗口中显示图像
cv2.imshow(winname, img)# 等待键盘按键,0表示无限等待
cv2.waitKey(0)# 关闭所有打开的窗口
cv2.destroyAllWindows()

在这里插入图片描述
img = cv2.rectangle(img, (50, 50), (n-100, n-50), (0, 0, 255), -1)

其中的 -1 改成0,就可以画一个非实心的矩形框,效果如下。

在这里插入图片描述

绘制圆形

OpenCV 提供了函数 cv2.circle()用来绘制圆。该函数的语法格式为:

img = cv2.circle( img, center, radius, color[, thickness[, lineType]] )

式中:

  • 参数 img、color、thickness、lineType 的含义如前面的说明所示。

  • center 为圆心。

  • radius 为半径

使用函数 cv2.circle()在一个白色背景图像内绘制一组同心圆。

代码如下:

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
(centerX,centerY) = (round(img.shape[1] / 2),round(img.shape[0] / 2))
# 将图像的中心作为圆心,实际值为 d/2
red = (0,0,255) # 设置白色变量
for r in range(5,round(d/2),12):cv2.circle(img,(centerX,centerY),r,red,3)# circle(载体图像,圆心,半径,颜色)
cv2.imshow("Demo19.3",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述

绘制椭圆

OpenCV 提供了函数 cv2.ellipse()用来绘制椭圆。该函数的语法格式为:
img=cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color[,
thickness[, lineType]])
式中:

  • 参数 img、color、thickness、lineType 的含义如前面的说明所示。
  • center 为椭圆的圆心坐标。
  • axes 为轴的长度。
  • angle 为偏转的角度。
  • startAngle 为圆弧起始角的角度。
  • endAngle 为圆弧终结角的角度。

使用函数 cv2.ellipse()在一个白色背景图像内随机绘制一组空心椭圆。

import numpy as np
import cv2
d = 400
img = np.ones((d,d,3),dtype="uint8")*255
# 生成白色背景
center=(round(d/2),round(d/2))
# 注意数值类型,不可以使用语句 center=(d/2,d/2)
size=(100,200)
# 轴的长度
for i in range(0,10):angle = np.random.randint(0,361)# 偏移角度color = np.random.randint(0,high = 256,size = (3,)).tolist()# 生成随机颜色,3[0,256)的随机数thickness = np.random.randint(1,9)cv2.ellipse(img, center, size, angle, 0, 360, color,thickness)
cv2.imshow("demo-tuoyuan",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行效果:
在这里插入图片描述

绘制多边形

OpenCV 提供了函数 cv2.polylines()用来绘制多边形。该函数的语法格式为:

img = cv2.polylines( img, pts, isClosed, color[, thickness[,
lineType[, shift]]])

式中:

  • 参数 img、color、thickness、lineType 和 shift 的含义如前面的说明所示。
  • pts 为多边形的各个顶点。
  • isClosed 为闭合标记,用来指示多边形是否是封闭的。若该值为 True,则将最后一个点与第一个点连接,让多边形闭合;否则,仅仅将各个点依次连接起来,构成一条曲线。

在使用函数 cv2.polylines()绘制多边形时,需要给出每个顶点的坐标。这些点的坐标构建了一个大小等于“顶点个数12”的数组,这个数组的数据类型必须为 numpy.int32。

使用函数 cv2.polylines()在一个白色背景图像内绘制一个多边形。

import numpy as np
import cv2
d = 400  # 图像尺寸# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255# 生成多边形的各个顶点坐标
pts = np.array([[200, 50], [300, 200], [200, 350], [100, 200]], np.int32)# 重新整形顶点数组,将其变为顶点数 x 1 x 2 的形状
pts = pts.reshape((-1, 1, 2))# 使用 cv2.polylines() 函数绘制多边形
# 第一个参数为图像,第二个参数为顶点数组,第三个参数为True表示封闭多边形,颜色为绿色,线宽为8
cv2.polylines(img, [pts], True, (0, 255, 0), 8)
cv2.imshow("duobianxing",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

函数 cv2.polylines()中的第 3 个参数 isClosed 是闭合标记,将该值设置为 False 时,仅仅将
各个顶点用线段连接,多边形是不封闭的。此时的代码为:

cv2.polylines(img,[pts],False,(0,255,0),8)

效果如下:

在这里插入图片描述

在图形上绘制文字

OpenCV 提供了函数 cv2.putText()用来在图形上绘制文字。该函数的语法格式为:

img=cv2.putText(img, text, org, fontFace, fontScale, color[,
thickness[, lineType[, bottomLeftOrigin]]])

式中:

  • 参数 img、color、thickness、lineType 和 shift 的含义如前面的说明所示。
  • text 为要绘制的字体。
  • org 为绘制字体的位置,以文字的左下角为起点。
  • fontFace 表示字体类型,其参数类型及含义如表 19-2 所示。
  • fontScale 表示字体大小。
  • bottomLeftOrigin 用于控制文字的方向。默认值为 False,当设置为 True 时,文字是垂直镜像的效果。

在这里插入图片描述

使用函数 cv2.putText()在一个白色背景图像内绘制文字。

代码如下:

import numpy as np
import cv2d = 400  # 图像尺寸# 创建一个白色背景的彩色图像,尺寸为d x d,3通道(RGB)
img = np.ones((d, d, 3), dtype="uint8") * 255# 定义字体
font = cv2.FONT_HERSHEY_SIMPLEX# 在图像上绘制红色的 "OpenCV" 文本,位置同样为(0, 200),字体大小为3,线宽为5
cv2.putText(img, 'OpenCV', (0, 200), font, 3, (0, 0, 255), 5)# 创建一个窗口并显示图像
cv2.imshow("weizi", img)cv2.waitKey(0)
cv2.destroyAllWindows()

该段程序在图像 img 中使用函数 cv2.putText()绘制了文字
“OpenCV”。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/68959.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL-每日一题【1341. 电影评分】

题目 表:Movies 表:Users 请你编写一个解决方案: 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。 …

利用ViewModel和LiveData进行数据管理

利用ViewModel和LiveData进行数据管理 1. 引言 在当今移动应用开发的世界中,数据管理是一个至关重要的方面。随着应用的复杂性不断增加,需要有效地管理和维护应用中的数据。无论是从服务器获取数据、本地数据库存储还是用户界面的状态,数据…

openpnp - 吸嘴是否吸取了元件的检测

文章目录 openpnp - 吸嘴是否吸取了元件的检测概述笔记补充 - 2023/8/11有bug, 元件底部视觉检测有时检测不到正确的元件外形END openpnp - 吸嘴是否吸取了元件的检测 概述 设备本身调试好了, 现在进行试贴. 发现一个奇怪的问题, 不管是否吸嘴吸取到了元件, 都会往板子上贴元…

【Windows 常用工具系列 8 -- 修改鼠标光标(指针)大小和颜色的快速方法方法】

文章目录 修改方法 上篇文章:Windows 常用工具系列 7 – 禁用win10自带的微软输入法 修改方法 Win键 i 快捷键进入设置页面,然后输入光标... 就会跳出修改鼠标大小与光标颜色的选项。 Win键是在计算机键盘左下角Ctrl和Alt键之间的按键 根据自己的需求…

SQL | 排序检索的数据

3-排序检索的数据 使用order by语句排序检索到的数据。 3.1-排序数据 使用SQL语句返回一个数据表的列。 select prod_id from products; --------------------- | prod_name | --------------------- | 8 inch teddy bear | | 12 inch teddy bear | | 18 inch teddy bear |…

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

又到每天一期学习爬虫的时间了,作为一名专业的爬虫程序员,今天要跟你们分享一个超实用的技巧,就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上?别担心,我会用通俗易懂的话来和你们说,让你…

【论文阅读】基于深度学习的时序预测——FEDformer

系列文章链接 论文一:2020 Informer:长时序数据预测 论文二:2021 Autoformer:长序列数据预测 论文三:2022 FEDformer:长序列数据预测 论文四:2022 Non-Stationary Transformers:非平…

【C++】stack容器

1.stack基本概念 英stk 美stk n.&#xff08;整齐的&#xff09;一堆&#xff1b;<英> 垛&#xff0c;堆&#xff1b;大量&#xff0c;许多&#xff1b;&#xff08;尤指工厂的&#xff09;大烟囱&#xff1b;&#xff08;图书馆的&#xff09;藏书架&#xff0c;双面书架…

C#字符串占位符替换

using System;namespace myprog {class test{static void Main(string[] args){string str1 string.Format("{0}今年{1}岁&#xff0c;身高{2}cm&#xff0c;月收入{3}元&#xff1b;", "小李", 23, 177, 5000);Console.WriteLine(str1);Console.ReadKey(…

科大讯飞星火模型申请与chatgpt 3.5模型以及new bing的对比

科大讯飞星火模型 申请科大讯飞星火认知大模型账号科大讯飞星火认知大模型使用1.界面介绍2. 在编程能力上与chatgpt 3.5对比科大讯飞星火模型chatgpt 3.5模型 3. 在图片生成能力上与new bing对比 总结 申请科大讯飞星火认知大模型账号 注册网址&#xff1a; 科大讯飞星火认知大…

【C++11保姆级教程】delete和default关键字

文章目录 前言一、delete关键字1.1 什么是delete关键字&#xff1f;1.2delete关键字的语法和用法1.3delete关键字的作用和优势 二、default关键字2.1 什么是default关键字&#xff1f;2.2default关键字的语法和用法2.3 default关键字的作用和优势 总结 前言 欢迎来到本教程&am…

竞赛项目 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…