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 cv2

n = 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 cv2

d = 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”。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IOC容器

DI(依赖注入):DI(Dependency Injection)是一种实现松耦合和可测试性的软件设计模式。它的核心思想是将依赖关系的创建与管理交给外部容器,使得对象之间只依赖于接口而不直接依赖于具体实现类。通过依赖注入…

C++ 动态规划经典案例解析之最长公共子序列(LCS)_窥探递归和动态规划的一致性

1. 前言 动态规划处理字符相关案例中,求最长公共子序列以及求最短编辑距离,算是经典中的经典案例。 讲解此类问题的算法在网上一抓应用一大把,即便如此,还是忍不住有写此文的想法。毕竟理解、看懂都不算是真正掌握,唯…

【LeetCode-简单】剑指 Offer 29. 顺时针打印矩阵(详解)

题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入:matrix [[1,2,3,4],[5,6,7,8],[9,10,1…

npm install 中 --save 和 --save-dev 是什么?

npm,全名 Node Package Manager,套件管理工具,package.json 会记下你在项目中安装的所有套件。 假设在项目中安装 lodash npm i --save lodash这样在 dependencies 中会出现: 如果修改了导入方式: npm i --save-dev …

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统

20230814让惠普(HP)锐14 新AMD锐龙电脑不联网进WIN11进系统 2023/8/14 17:19 win11系统无法跳过联网 https://www.xpwin7.com/jiaocheng/28499.html Win11开机联网跳过不了怎么办?Win11开机联网跳过不了解决方法 Win11开机联网跳过不了怎么办?Win11开机…

【C++】开源:spdlog跨平台日志库配置使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍spdlog日志库配置使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下…

Qt 屏幕偶发性失灵

项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…

react实现模拟弹框遮罩的自定义hook

需求描述 点击按钮用于检测鼠标是否命中按钮 代码实现 import React from react; import {useState, useEffect, useRef} from react;// 封装一个hook用来检测当前点击事件是否在某个元素之外 function useClickOutSide(ref,cb) {useEffect(()>{const handleClickOutside…

互联网发展历程:跨越远方,路由器的启示

互联网的蓬勃发展,一直在追求更广阔的连接,更遥远的距离。然而,在早期的网络中,人们面临着连接距离有限的问题。一项重要的技术应运而生,那就是“路由器”。 连接受限的问题:距离有限 早期的网络受限于直接…

vue+flask基于知识图谱的抑郁症问答系统

vueflask基于知识图谱的抑郁症问答系统 抑郁症已经成为当今社会刻不容缓需要解决的问题,抑郁症的危害主要有以下几种:1.可导致病人情绪低落:抑郁症的病人长期处于悲观的状态中,感觉不到快乐,总是高兴不起来。2.可导致工…

安卓13解决链接问题

作为Android用户,你可能已经注意到了一个问题——Android 13不再支持PPTP协议。但请别担心,作为一家专业的代理供应商,我们将与你分享解决方案,让你轻松解决L2TP问题,享受到高水平的连接体验。本文将为你提供实用的操作…

计算机竞赛 python+opencv+深度学习实现二维码识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 pythonopencv深度学习实现二维码识别 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:3分 该项目较为新颖&…

安全头响应头(三)​X-Content-Type-Options

一 X-Content-Type-Options响应头 说明:先写个框架,后续补充 思考:请求类型是 "style" 和 "script" 是什么意思? script标签 style StyleSheet JavaScript MIME type 文件扩展和Content-Type的映射关系 场景: 一个…

Element Plus报错:ResizeObserver loop completed with undelivered notifications.

el-selected踩坑&#xff1a;el-selected 显示下拉框 mouseover 时报错&#xff01;&#xff01;&#xff01; 原来是属性 popper-append-to-body 被废除&#xff0c;改为 teleported。 element ui <el-select:popper-append-to-body"false"value-key"id&q…

Vscode 常用操作教程

一、语言换成中文 这是我们可以直接点击左边栏第四个图标搜索插件 chinese ,也可以直接ctrlshiftp快捷键也会出来如图所示图标&#xff0c;出来chinese 插件之后选择安装install,安装完成之后重新ctrlshiftp会出现如图所示页面 找到我的鼠标在的地方对应的中文&#xff0c;此时…

maven install

maven install maven 的 install 命令&#xff0c;当我们的一个 maven 模块想要依赖其他目录下的模块时&#xff0c;直接添加会找不到对应的模块&#xff0c;只需要找到需要引入的模块&#xff0c;执行 install 命令&#xff0c;就会将该模块放入本地仓库&#xff0c;就可以进…

大数据Flink(五十九):Flink on Yarn的三种部署方式介绍以及注意

文章目录 Flink on Yarn的三种部署方式介绍以及注意 一、Pre-Job 模式部署作业

【LeetCode75】第二十九题 删除链表的中间节点

目录 题目&#xff1a; 示例; 分析: 代码: 题目&#xff1a; 示例; 分析: 给我们一个链表&#xff0c;让我们把链表中间的节点删了。 那么最直观最基础的办法是遍历两边链表&#xff0c;第一遍拿到链表长度&#xff0c;第二次把链表中间节点删了。 这个暴力做法我没事过…

Sui网络的稳定性和高性能

Sui的最初的协议开发者设计了可扩展的网络&#xff0c;通过水平扩展的方式来保持可负担得起的gas费用。其他区块链与之相比&#xff0c;则使用稀缺性和交易成本来控制网络活动。 Sui主网上线前90天的数据指标证明了这一设计概念&#xff0c;在保持100&#xff05;正常运行的同…

无涯教程-Perl - setservent函数

描述 在第一次调用getservent之前,应先调用此函数。 STAYOPEN参数是可选的,在大多数系统上未使用。当getservent()检索服务数据库中下一行的信息时,然后setervent设置(或重置)枚举到主机条目集的开头。 语法 以下是此函数的简单语法- setservent STAYOPEN返回值 此函数不返…