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

news2024/12/22 19:56:08

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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

高忆管理:策略:短期利空落地 市场有望企稳回升

高忆管理指出,基于A股商场出资环境分析,尤其是当时商场存量博弈为主的布景下,主张重视以下“21”主线轮动:(1)国产科技代替立异:电子(半导体、消费电子)、通信&#xff0…

人工智能在监控系统中的预测与优化:提升效率和响应能力

引言:人工智能的发展给监控系统带来了新的可能性,通过分析历史监控数据和其他相关数据,人工智能可以预测未来可能发生的事件,如交通拥堵、安全隐患等,并帮助优化监控系统的配置和资源分配。这种预测和优化的能力可以提…

Antv/G2 柱状图

Antv/G2 教程 G2 是一套基于图形语法理论的可视化底层引擎,以数据驱动,提供图形语法与交互语法,具有高度的易用性和扩展性。使用 G2,无需关注图表各种繁琐的实现细节,一条语句即可使用 Canvas 或 SVG 构建出各种各样的…

一般股票量化交易接口需要用到哪些编程语言?

股票量化交易接口可以使用多种编程语言进行开发和调用。以下是一些常用的编程语言: 1. Python:Python是一种脚本语言,广泛应用于量化交易领域。它有丰富的第三方库和工具,如Pandas、NumPy和pyalgotrade等,可用于数据分…

nodejs+vue+elementui+express智慧社区小区物业管理系统的设计与实现_2p760

开发语言 node.js 框架:Express 前端:Vue.js 数据库:mysql 数据库工具:Navicat 开发软件:VScode 前端nodejsvueelementuiexpress vue的文件结构其实就是一个index.html 中间的内容,用的是vue,但最终都会转…

问道管理:县域商业3年行动计划发布 城中村改造有望带动多行业需求

昨日,两市股指低开低走,三大股指早盘均跌超1%,午后跌幅有所收窄;到收盘,沪指跌0.34%报3178.43点,深成指跌0.5%报10755.14点,创业板指跌1.02%报2164.69点;两市算计成交7419亿元&#…

海国图志#2:这一周难忘瞬间,吐血整理,不得不看

这里记录每周值得分享的新闻大图,周日发布。 文章以高清大图呈现,解说以汉语为主,英语为辅,英语句子均来自NYTimes、WSJ、The Guardian等权威媒体原刊。 存档时段:20230807-20230813 葡萄牙,雷根戈 一架直升…

这四种订货系统不能选(三):不能定制开发

在企业的运营过程中,需求会不断变化。如果不能随着运营需求的变化而进行定制开发的订货系统,那么它可能会变得鸡肋。 一个不能随需求变化定制开发的订货系统可能无法满足企业在不同阶段的需求和业务流程。企业在运营过程中可能需要新增、修改或调整一些功…

什么开放式耳机音质好?值得推荐的开放式耳机分享

与封闭式耳机相比,开放式耳机具有更为自然、真实的音质,能够更好地还原音乐现场的声音环境。以下是几款值得推荐的开放式耳机,都来看看有哪些吧。 推荐一:NANK南卡00压开放式耳机 点评:体验最好的开放式耳机没有之一…

K8S系列四:服务管理

写在前面 本文是K8S系列第四篇,主要面向对k8s新手同学。阅读本文需要读者对k8s的基本概念,比如Pod、Deployment、Service、Namespace等基础概念有所了解,尚且不了解的同学推荐先阅读本系列的第一篇文章《K8S系列一:概念入门》[1]…

VKL060低功耗设计段码LCD液晶驱动芯片工作电流?小于10μA资料分享

型号:VKL060 品牌:永嘉微电/VINKA 封装:SSOP24 年份:新年份 原厂工程服务,技术支持 VKL060概述: VKL060是字段式液晶显示驱动芯片。M18202 功能特点: ★ 液晶驱动输出: Common 输出4线&#xff…

美芯三巨头游说失败,开始分头行动,外媒:美芯唱反调了

早前美国芯片三巨头高通、Intel、NVIDIA奔赴华盛顿与拜登会面,希望放宽对华芯片供应限制,然而并未取得成果,如此情况下,美芯巨头无法承受失去中国市场的后果,开始纷纷采取行动。 一、美芯为中国市场定制芯片 美国芯片企…

【excel技巧】Excel表格如何取消隐藏行?

Excel工作表中的行列隐藏了数据,如何取消隐藏行列呢?今天分享几个方法给大家 方法一: 选中隐藏的区域,点击右键,选择【取消隐藏】就可以了 方法二: 如果工作表中有多个地方有隐藏的话,还是建…

重磅更新,HertzBeat 集群版发布,易用友好的开源实时监控系统!

什么是 HertzBeat? HertzBeat 赫兹跳动 是一个拥有强大自定义监控能力,高性能集群,无需 Agent 的开源实时监控告警系统。 特点 集 监控告警通知 为一体,支持对应用服务,数据库,操作系统,中间件&#xf…

深入源码分析kubernetes informer机制(零)简单了解informer

[阅读指南] 基于kubernetes 1.27 stage版本 为了方便阅读,后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 关于client-goInformer是什么为什么需要informerInformer工作流程后续分析计划 关于client-go client-go是kubernetes节点与服务端进行资源…

Python-OpenCV中的图像处理-视频分析

Python-OpenCV中的图像处理-视频分析 视频分析Meanshift算法Camshift算法光流 视频分析 学习使用 Meanshift 和 Camshift 算法在视频中找到并跟踪目标对象: Meanshift算法 Meanshift 算法的基本原理是和很简单的。假设我们有一堆点(比如直方 图反向投影得到的点&…

如何在 3Ds Max 中准确地将参考图像调整为正确的尺寸?

您是否想知道如何在 3Ds Max 中轻松直观地调整参考图像的大小,而无需借助第三方解决方案、插件或脚本? 我问自己这个问题,并高兴地发现了FFD Box 2x2x2,我无法停止钦佩这个修改器的多功能性。 在本文中,我想与您分享一…

免费网站客服机器人来了(基于有限状态机),快来体验下

免费网站客服机器人来了,快来体验下 51jiqiren.cn 五分钟就可以完成一个简单的机器人. 懂json的同学可以自定义状态和状态跳转,完成复杂的业务流程. 更多功能还在开发中. 网站右下角点"联系客服"截图: 弹出来了: 后端管理界面: 有限状态机界面: 数据界面: 在网站…

微信小程序云开发快速入门(2/4)

前言 我们对《微信小程序云开发快速入门(1/4)》的知识进行回顾一下。在上章节我们知道了云开发的优势以及能力,并且我们还完成了码仔备忘录的本地版到网络版的改造,主要学习了云数据库同时还通过在小程序使用云API直接操作了云数…

推断统计(配对样本t检验)

根据题目我们也可以看出配对样本 t 检验是用来检验两配对正态总体的均值是否存在显著差异的一种假设检验方法,虽然是两组数据但是其来自同一部分个体在两个时间段内的测试数据,是同一部份个体! 进行配对样本 t 检验之后也是分别做出原假设和备…