从零开始学cv-17:图像绘制基本图形

文章目录

  • 前言
  • 一、绘制直线与箭头
  • 二、绘制矩形
  • 三、绘制圆形椭圆形


前言

随着计算机视觉技术的不断发展,OpenCV作为一款强大的开源图像处理库,受到了越来越多开发者的喜爱。本文将带领读者走进OpenCV的世界,从基础入手,详细介绍如何在图片上进行绘制操作。通过学习本文,您将掌握如何在图片上绘制线条、矩形、圆形等基本图形,以及如何为图片添加文字。让我们一起探索图像处理的艺术,开启创意无限的世界。

一、绘制直线与箭头

在opencv中绘制直线的api为cv2.line(img, pt1, pt2, color, thickness, lineType, shift)
参数说明:

img: 要绘制直线的图像。
pt1: 直线起点坐标,格式为(x1, y1)。
pt2: 直线终点坐标,格式为(x2, y2)。
color: 直线的颜色,使用BGR格式,例如蓝色为(255, 0, 0)。
thickness: 直线的粗细,如果为-1,则绘制填充的矩形。
lineType: 线条的类型,通常使用8连接类型。
shift: 坐标点的小数位数。

绘制箭头的直线api为cv2.arrowedLine(img, pt1, pt2, color, thickness, line_type, shift, tipLength)
参数说明:

img: 输出图像,它应该是用来绘制箭头的图像,可以是灰度图像或彩色图像。
pt1: 箭头起点,格式为 (x1, y1)。
pt2: 箭头终点,格式为 (x2, y2)。
color: 箭头的颜色,使用 BGR 格式,例如蓝色为 (255, 0, 0)。
thickness: 线条的粗细。如果为 -1,则绘制填充的箭头。
line_type: 线条的类型,通常使用 8 连接类型,表示 8 邻接。
shift: 坐标点的小数位数。
tipLength: 箭头尖端长度,表示为箭头总长度的比例(通常在 0 到 1 之间)。默认值为 0.1。

案例:

import cv2
import numpy as np
# 创建一个空白的黑色图像
img = np.zeros((200, 200, 3), dtype=np.uint8)
# 定义箭头的起点和终点
pt0 = (20, 20)
pt1 = (50, 50)
pt2 = (150, 150)
# 绘制直线
cv2.line(img, pt0, pt1, (0, 255, 0), 2)
# 绘制箭头
cv2.arrowedLine(img, pt1, pt2, (255, 0, 0), thickness=2, tipLength=0.1)
# 显示图像
cv2.imshow('Arrowed Line', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

二、绘制矩形

在opencv中实现绘制矩形的api为:cv2.rectangle(img, pt1, pt2, color, thickness=None, lineType=None, shift=None)
函数介绍:

img: 要在其上绘制矩形的输入图像。图像应该是一个已经存在的图像矩阵,可以是灰度图像或彩色图像。
pt1: 矩形的一个角的坐标,格式为 (x1, y1)。
pt2: 与 pt1 相对的矩形的另一个角的坐标,格式为 (x2, y2)。
color: 矩形的颜色,使用 BGR 格式,例如红色为 (0, 0, 255)。
thickness: 矩形边框的粗细。如果为 -1,则矩形内部将被填充指定的颜色。
lineType: 线条的类型,用于指定绘制矩形边框的连接类型。通常使用 cv2.LINE_8(8 连接)。
shift: 坐标点的小数位数。这个参数用于绘制亚像素精度的矩形,但在大多数情况下不需要使用。

代码示例:

import cv2
import numpy as np# 创建一个空白的黑色图像
img = np.zeros((200, 200, 3), dtype=np.uint8)# 定义矩形的两个对角点
pt1 = (50, 50)
pt2 = (150, 100)# 绘制矩形
cv2.rectangle(img, pt1, pt2, (0, 255, 0), thickness=2)# 显示图像
cv2.imshow('Rectangle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果:
在这里插入图片描述
cv2.rectangle只能绘制垂直矩形,若想要绘制倾斜矩形需要知道矩形的四个点坐标,然后通过cv2.drawContours()绘制矩形轮廓。

三、绘制圆形椭圆形

绘制圆形的api为cv2.circle(img, center, radius, color, thickness=1, lineType=8, shift=0)
参数说明:

img: 这是你要在其上绘制圆的图像。它应该是一个二维或三维的numpy数组。
center: 这是一个元组,表示圆心的坐标 (x, y)。
radius: 这是一个整数,表示圆的半径。
color: 这是一个元组,表示圆的颜色。在 OpenCV 中,颜色是用 BGR 格式表示的,而不是 RGB。例如,蓝色是 (255, 0, 0)。
thickness: 这是一个整数,表示圆的线条粗细。如果设置为 -1,则圆将被填充。如果设置为 0 或省略,则不会绘制圆。
lineType: 这个参数指定了圆边缘的线型。它的默认值是 8,表示 8 连接线型。其他的线型包括 4(4 连接线型)和 CV_AA(抗锯齿线型)。
shift: 这个参数是圆心坐标和半径的小数位数。默认值是 0,表示圆心坐标和半径都是整数。这个参数很少使用。

案例:

import cv2
import numpy as np# 创建一个空白的黑色图像
img = np.zeros((200, 200, 3), dtype=np.uint8)# 定义圆的中心点坐标和半径
center_coordinates = (100, 100)
radius = 50
# 定义圆的颜色和线条粗细
color = (255, 0, 0)  # 蓝色
# 绘制圆
cv2.circle(img, center_coordinates, radius, color, thickness=-1, lineType=cv2.LINE_AA)
# 显示图像
cv2.imshow('Circle', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

绘制椭圆的api为:cv2.ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)。
参数说明:

img: 这是你要在其上绘制椭圆的图像。
center: 这是一个元组,表示椭圆中心的坐标 (x, y)。
axes: 这是一个元组,表示椭圆主轴的长度 (长轴长度, 短轴长度)。
angle: 这是一个浮点数,表示椭圆旋转的角度(逆时针方向)。角度是相对于 x 轴的。
startAngle: 这是一个浮点数,表示椭圆弧的起始角度,以度为单位。
endAngle: 这是一个浮点数,表示椭圆弧的结束角度,以度为单位。
color: 这是一个元组,表示椭圆的颜色。颜色是用 BGR 格式表示的。
thickness: 这是一个整数,表示椭圆轮廓的线条粗细。如果设置为 -1,则椭圆将被填充。
lineType: 这个参数指定了椭圆边缘的线型。默认值是 8,表示 8 连接线型。
shift: 这个参数是中心坐标和轴长度的小数位数。

使用案例:

import cv2
import numpy as np# 创建一个空白的黑色图像
img = np.zeros((200, 200, 3), dtype=np.uint8)# 定义椭圆的中心点坐标、轴长度、旋转角度、起始角度和结束角度
center_coordinates = (100, 100)
axesLength = (50, 25)
angle = 0
startAngle = 0
endAngle = 360# 定义椭圆的颜色和线条粗细
color = (255, 0, 0)  # 蓝色
thickness = -1  # 填充椭圆# 绘制椭圆
cv2.ellipse(img, center_coordinates, axesLength, angle, startAngle, endAngle, color, thickness)# 显示图像
cv2.imshow('Ellipse', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

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

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

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

相关文章

通过低代码平台实现CRM系统的快速开发与部署

在当今瞬息万变的商业环境中,企业需要快速响应市场变化,提升客户关系管理(CRM)系统的灵活性和效率。传统的CRM系统开发周期长、成本高、维护复杂,难以满足企业快速部署和迭代的需求。低代码平台的出现,为CR…

Python神仙级思维导图+入门教程(非常详细,入门从这篇开始)

入门 Python 绝非难事,但如何让自己坚持学下去是如今很多学习者面对的一大难题。为了避免像背单词永远停留在 abandon 一样,积极展开自救的小编在尝试过一些入门方法后,终于找到了一个超级棒的一份思维导图视频教程 这是我刚开始学习python时…

鸿蒙开发之ArkUI 界面篇 二十五 购物车

实现效果如下图: 为了好分析,我们将界面分为两部分,标注如下: 很明显区域1和区域2是垂直关系,用Colum容器,区域1又分为左右两部分,是水平关系,大容器使用的是Row,左边是…

爬虫实战:从HTTP请求获取数据解析社区,自动生成代码

在过去的实践中,我们通常通过爬取HTML网页来解析并提取所需数据,然而这只是一种方法。另一种更为直接的方式是通过发送HTTP请求来获取数据。考虑到大多数常见服务商的数据都是通过HTTP接口封装的,因此我们今天的讨论主题是如何通过调用接口来…

eBPF实战教程七 | 性能监控工具—bpftop

目录 bpftop介绍 工作原理 工具使用 功能小结 在之前的文章《USDT的预埋与性能测评》中,我们通过多次触发探针并统计用户态函数调用时间来分析USDT的性能,这种方法在编写demo时非常便捷,但在工程化的项目中,我们通常无法直接修…

竹云参编 | 《个人信息保护合规审计人员能力发展研究报告(2024)》正式发布!

近日,“个人信息保护合规审计实务研讨会”在北京成功举办,来自中国网络安全审查认证和市场监管大数据中心、中国通信学会、中国通信企业协会、中国行为法学会网络与数据法学研究部、蒙牛乳业、平安集团、大成律师事务所、竹云等80余名专家学者、行业精英…

【python实操】python小程序之魔法方法(__init__方法、__str__方法、__del__方法)

引言 python小程序之魔法方法(__init__方法、__str__方法、__del__方法) 文章目录 引言一、__init__方法1.1 题目1.2 代码1.3 代码解释1.3.1 逐行注释1.3.2 代码执行过程 二、__str__方法2.1 题目2.2 代码2.3 代码解释 三、__del__方法3.1 题目3.2 代码3…

2句话说通 一体化模型与矢量模型的不同

有人说:一个人从1岁活到80岁很平凡,但如果从80岁倒着活,那么一半以上的人都可能不凡。 生活没有捷径,我们踩过的坑都成为了生活的经验,这些经验越早知道࿰

安卓系统属性persist类型prop深入剖析

背景: 近来学员朋友在群里问道了prop属性值进行持久化存储相关的问题,针对prop大部分情况下都是在代码端进行get获取读取操作,因为很多系统属性都是ro类型的,即不可以修改的,有一些debug可以修改的属性,但…

GC9008为什么能替代MX6208应用于红外开关,电流开关上

GC9008作为一种新型集成电路,具备了多个方面的优势,使其能够有效替代MX6208。以下是GC9008替代MX6208的主要原因及其优势: 1. 更低的功耗 优势:GC9008在设计上进行了优化,能够在更低的电压下运行,从而显著…

Android Compose 控件基本属性

本文的代码由上一篇文章的Demo进一步书写完成, 传送门:Android Compose的基本使用-CSDN博客 _____________________________________________________________________________ 以下代码分别列举了控件的: 内边距,外边距,内容居中,渐变自定义边框,宽度权重,string资源引用等…

JVM 内存模型与垃圾回收过程详解

JVM 内存模型与垃圾回收过程详解 文章目录 JVM 内存模型与垃圾回收过程详解1. JVM内存分区1.1 具体分区1.2 JVM内存分区的必要性 2. 垃圾回收2.1 CMS垃圾回收器2.2 G1垃圾回收器2.3 JVM垃圾回收从新生代到老年代 1. JVM内存分区 1.1 具体分区 Java虚拟机(JVM&#…

Ubuntu 18.04安装storcli查看阵列信息

rootCeph03:/opt/MegaRAID/storcli# cat /etc/issue Ubuntu 18.04.5 LTS \n \l 准备好storcli的安装包 解压 解压之后可以看到 根据系统版本选择 把storcli_1.18.11_all.deb包传到服务器 使用命令dpkg -I storcli_1.18.11_all.deb ./storcli64 show ./storcli64 /c1 show …

Nuxt3哔哩哔哩移动端项目实战

Nuxt3 - 哔哩哔哩 - 项目实战 简介 Nuxt 框架提供了一种基于 Node.js 的服务端渲染方案 SSR(Server Side Rendering),可以让 Vue 应用在服务器端进行渲染,从而提高页面的加载速度和 SEO。 项目预览 在线预览 https://bilibil…

室内人行与导航系统有哪些多样化的功能?

在现代化建筑的迷宫中,室内人行与导航系统如同一位无形的向导,引领我们穿梭于复杂的空间之中,极大地提升了人们在室内环境中的便捷性和安全性。这一技术领域的飞速发展,不仅体现在定位精度的提升上,更在于其多样化的功…

基于卷积神经网络的书法字体识别系统,resnet50,mobilenet模型【pytorch框架+python】

更多目标检测和图像分类识别项目可看我主页其他文章 功能演示: 基于卷积神经网络的书法字体识别系统,resnet50,mobilenet【pytorch框架,python,tkinter】_哔哩哔哩_bilibili (一)简介 基于卷…

台球助教预约小程序源码开发:技术解析与示例代码

随着数字化时代的到来,信息技术与体育运动的融合日益紧密。台球作为一项深受大众喜爱的运动,其教学训练领域也迎来了技术创新的浪潮。本文将探讨台球助教预约小程序的开发过程,从技术选型、功能设计到示例代码展示renxb001,全面解…

ComfyUI | 高清出图+艺术字+文字直出工作流(附工作流)

今天给大家带来一个可以直接打字的工作流,非常适合设计师使用!拒接二次修改!轻松上手设计,无需Photoshop技能,直接输入文字即可,操作极为简便,极大提升工作效率。 以国庆海报为例 庆祝75周年国…

搭建Serverless社交媒体分析平台,Dataxet运维成本降低50%

社交媒体平台发展如火如荼,据相关机构统计,2024年全球社交媒体活跃用户已占全球人口总数约62.5%。亚洲知名智能媒体公司Dataxet意识到社交媒体数据分析潜在商业价值,即推出全新的社交媒体分析平台DTX360,用于提供媒体监测、社交网…

Canvas:AI协作的新维度

在人工智能的浪潮中,OpenAI的最新力作Canvas,不仅是一款新工具,它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面,让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…