OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介【C++的OpenCV 第十五课】

🎉🎉🎉 欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!🎉🎉🎉
💖 C++\Python所有的入门技术皆在 我的主页 \color{#0cc123}{我的主页} 我的主页:我的主页



一、从创建一个图像开始 \color{blue}{一、从创建一个图像开始} 一、从创建一个图像开始

1.1 直接通过 M a t 类完成创建 \color{green}{1.1 直接通过Mat类完成创建} 1.1直接通过Mat类完成创建

1.1.1 利用构造函数Mat中的一些形式完成快速创建

这里边内容真不少:
在这里插入图片描述
当然其中不是每个内容都需要大家去掌握,这里为大家整理和介绍一种非常常用的方法,如果这个可以掌握剩下都是可以无师自通的!

(a) 实际案例–创建一个黑色(或者白色、纯色)背景图像

案例一:

#include <opencv2/opencv.hpp>
using namespace cv;int main()
{Mat img(Size(512, 512), CV_8UC3, Scalar(0, 0, 0));return 0;
}

这里使用的是这个函数原型:
在这里插入图片描述
        这样就可以完成一个任意颜色,任意大小图片且通道数任意的图像,非常方便好用!

稍微解释一下:

  1. Size对象用于描述图像的大小,可以理解为是长宽。
  2. type就是图像类型咯:8U的意思就是8bit的uchar(usigned int)(8U),且通道数为3 (C3).
  3. Scalar:也是一种数据结构,这里表示图像颜色(BGR模式中利用三个数字分别描述三种通道(蓝绿红)的值,三个0即表示三个通道颜色强度最小,即黑色。)

案例二:

#include <opencv2/opencv.hpp>
int main()
{int width = 640; // 图像宽度int height = 480; // 图像高度cv::Mat image1(height, width, CV_8UC3, cv::Scalar(0, 0, 0));return 0;
}

        这里使用的是这个函数原型:
在这里插入图片描述
同样这也可以完成一个黑色图像的创建,解释一下:

  1. rows :行数,即图像的高
  2. cols:列数,即图像的宽

1.1.3 利用zeros和ones完成图像的创建

(a)Mat::zeros()实例–创建图像

案例三:

#include <opencv2/opencv.hpp>
int main()
{int width = 640; // 图像宽度int height = 480; // 图像高度cv::Mat image2 = cv::Mat::zeros(height, width, CV_8UC3);return 0;
}

        大家应该留意到了,这个方法并不是利用Mat的构造函数完成图像的创建的,而这也是一种非常常用的方法!
        这里用到的是这个函数原型:
在这里插入图片描述

        这里做一个解释,大家一定注意往下看哈!

  • 首先,这个方法为什么叫zeros?
    因为,创建的Mat对象中所有通道的值都是0,即一个纯0矩阵。.
  • 参数解释:
    • rows和cols:行和列数(即高和宽)
    • type:图像的类型,这里给大家把所有常用的图像类型整理出来放在下边:
      CV_8UC1:8位无符号单通道图像
      CV_8UC2:8位无符号双通道图像
      CV_8UC3:8位无符号三通道图像
      CV_8UC4:8位无符号四通道图像
      CV_16UC1:16位无符号单通道图像
      CV_16UC2:16位无符号双通道图像
      CV_16UC3:16位无符号三通道图像
      CV_16UC4:16位无符号四通道图像
      CV_32FC1:32位浮点单通道图像
      CV_32FC2:32位浮点双通道图像
      CV_32FC3:32位浮点三通道图像
      CV_32FC4:32位浮点四通道图像

        它也有其他的使用方法,但是大同小异:
在这里插入图片描述

(b)Mat::ones()实例–创建图像

        这里的内容其实完全没有必要照抄一份zeros的代码,因为其和zeros的使用上只有名称不同而已,其他完全一样!相同到所有的函数原型都一模一样,只是换个名字,所以会用zeros,就一定会用ones
        我们来聊一聊差异:

Mat A = Mat::ones(100, 100, CV_8U) * 3; // 创建一个全是3的100*100的单通道图像
// 这里一定注意“ * 3 ”的位置!

        是不是挺有趣了?


二、画线、长方形、圆形、多边形 \color{blue}{二、画线、长方形、圆形、多边形} 二、画线、长方形、圆形、多边形

2.1 画线 \color{green}{2.1 画线} 2.1画线

2.1.1 line()函数原型及解释

函数原型:

void cv::line 	( 	InputOutputArray  	img,Point  	pt1,Point  	pt2,const Scalar &  	color,int  	thickness = 1,int  	lineType = LINE_8,int  	shift = 0 ) 		
Python:cv.line(	img, pt1, pt2, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • img:画线的图像,即画在哪个图像上
  • pt1:线的起始点
  • pt2:线的重点
  • color:暂时理解为颜色即可,后续内容会为大家持续更新
  • thickness:线宽,即线的粗细
  • lineType:线型
    在这里插入图片描述
  • shift:点坐标中的小数位数。如果不指定,则为整数。

2.1.2 代码实例

实际案例:

#include <opencv2/opencv.hpp>
int main()
{// 白色图像:cv::Mat img(Size(512, 512), CV_8UC3, Scalar(255, 255, 255));// 画一条蓝色的线在img上。    cv::line(img, cv::Point(0, 0), cv::Point(100, 100), cv::Scalar(255, 0, 0), 5);return 0;
}

这些都是简单案例,文章最后带大家来完成一个综合案例!

2.2 画长方形 \color{green}{2.2 画长方形} 2.2画长方形

2.2.1 rectangle()原型及解释

函数原型一:

void cv::rectangle 	( 	InputOutputArray  	img,Point  	pt1,Point  	pt2,const Scalar &  	color,int  	thickness = 1,int  	lineType = LINE_8,int  	shift = 0 ) 		
Python:cv.rectangle(	img, pt1, pt2, color[, thickness[, lineType[, shift]]]	) -> 	imgcv.rectangle(	img, rec, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • img:画线的图像,即画在哪个图像上
  • pt1:左上顶点的位置
  • pt2:右下顶点的位置(通过左上和右下顶点就可以得出长方形的宽高)
  • color:暂时理解为颜色即可,后续内容会为大家持续更新
  • thickness:线宽,即线的粗细,如果为负数,即向内填充,实心色长方形
  • lineType:线型
    在这里插入图片描述
  • shift:点坐标中的小数位数。如果不指定,则为整数。

函数原型二:

void cv::rectangle 	( 	InputOutputArray  	img,Rect  	rec,const Scalar &  	color,int  	thickness = 1,int  	lineType = LINE_8,int  	shift = 0 ) 		
Python:cv.rectangle(	img, pt1, pt2, color[, thickness[, lineType[, shift]]]	) -> 	imgcv.rectangle(	img, rec, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • rec :这是一个Rect对象,该对象可以通过
template<typename _Tp > 
Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height) 

完成创建,左上顶点坐标(x,y),以及宽高width和height,而这里的_Tp其实就是模板指定的类型,可以是int、float、double等。同样基于这个模板产生了三个类:Rect2i、Rect2d、Rect2f,而其中Rect2i就是通过typedef规定的咱们常见的Rect类。

2.2.2 代码实例

实际案例:

#include <opencv2/opencv.hpp>
int main()
{// 白色图像:cv::Mat img(Size(512, 512), CV_8UC3, Scalar(255, 255, 255));// 画一个绿色的线宽为3的正方形在img上。    cv::rectangle(img, cv::Point(0, 0), cv::Point(150, 150), cv::Scalar(0, 255, 0), 3);return 0;
}

2.3 画圆形 \color{green}{2.3 画圆形} 2.3画圆形

2.3.1 circle()原型及解释

函数原型一:

void cv::circle 	( 	InputOutputArray  	img,Point  	center,int  	radius,const Scalar &  	color,int  	thickness = 1,int  	lineType = LINE_8,int  	shift = 0 ) 		
Python:cv.circle(	img, center, radius, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • img:画线的图像,即画在哪个图像上
  • center:圆心的位置
  • radius:圆的半径
  • color:暂时理解为颜色即可,后续内容会为大家持续更新
  • thickness:线宽,即线的粗细,如果为负数,即向内填充,实心色
  • lineType:线型
    在这里插入图片描述
  • shift:点坐标中的小数位数。如果不指定,则为整数。

2.3.2 代码实例

#include <opencv2/opencv.hpp>
int main()
{// 白色图像:cv::Mat img(Size(512, 512), CV_8UC3, Scalar(255, 255, 255));// 画一个红色半径为100的实心圆在img上。    cv::circle(img, cv::Point(200, 200), 100, cv::Scalar(0, 0, 255), -1);return 0;
}

2.3 画多边形 \color{green}{2.3 画多边形} 2.3画多边形

2.3.1 polylines()原型及解释

函数原型一:

void cv::polylines 	( 	InputOutputArray  	img,InputArrayOfArrays  	pts,bool  	isClosed,const Scalar &  	color,int  	thickness = 1,int  	lineType = LINE_8,int  	shift = 0 ) 		
Python:cv.polylines(	img, pts, isClosed, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • img:画在哪个图像上的源图像
  • pts:多边形各个顶点坐标,构成一个 std::vectorcv::Point 对象
  • isClosed:是否需要闭合多边形
  • color: 多边形的颜色
  • thickness:线宽,即线的粗细,如果为负数,即向内填充,实心色
  • lineType:线型
    在这里插入图片描述
  • shift:点坐标中的小数位数。如果不指定,则为整数。

2.3.2 代码实例

#include <opencv2/opencv.hpp>
int main()
{// 白色图像:cv::Mat img(Size(512, 512), CV_8UC3, Scalar(255, 255, 255));// 画一个深绿色和深红色混合色闭合的多边形,// 多边形有四个点cv::Point(250, 250), cv::Point(250, 300), cv::Point(300, 320), cv::Point(320, 270)。// 线宽为3 std::vector<cv::Point> pts = {cv::Point(250, 250), cv::Point(250, 300), cv::Point(300, 320), cv::Point(320, 270)};cv::polylines(img, pts, true, cv::Scalar(0, 255, 255), 3);return 0;
}

三、在图像上显示文本内容 \color{blue}{三、在图像上显示文本内容} 三、在图像上显示文本内容

3.1 基本方法 p u t T e x t ( ) 介绍 \color{green}{3.1 基本方法putText()介绍} 3.1基本方法putText()介绍

函数原型:

void cv::putText 	( 	InputOutputArray  	img,const String &  	text,Point  	org,int  	fontFace,double  	fontScale,Scalar  	color,int  	thickness = 1,int  	lineType = LINE_8,bool  	bottomLeftOrigin = false ) 		
Python:cv.putText(	img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]	) -> 	img

解释一下:

  • img:显示文本的原图像
  • text:文本内容,是一个字符串
  • org:文本内容的左下底角在图像img上的位置
  • fontFace:字体,有如下几种字体可选:
    在这里插入图片描述
  • fontScale:字体缩放因子,即OpenCV的字体有一个默认大小,你可以基于这个大小设置字体的大小,是一个double类型的值,使用方法:默认字体大小*fontScale。
  • color:字体颜色
  • thickness:线宽,即字体的粗细,
  • lineType:线型
    在这里插入图片描述
  • bottomLeftOrigin :如果为true,则图像数据原点位于左下角。否则,它在左上角。即文字默认的原点坐标是图像的左上角还是左下角。

3.2 实际案例 \color{green}{3.2 实际案例} 3.2实际案例

代码实例:

#include <opencv2/opencv.hpp>
int main()
{// 黑色图像:cv::Mat img(Size(512, 512), CV_8UC3, Scalar(0, 0, 0));// 距离图像左上角位置(50,450)位置,内容为“OpenCV Tutorial”的白色文字cv::putText(img, "OpenCV Tutorial", cv::Point(50, 450), cv::FONT_HERSHEY_COMPLEX_SMALL, 1, cv::Scalar(255, 255, 255), 2,false);// 显示图像cv::imshow("OpenCV Tutorial", img);cv::waitKey(0);return 0;
}

四、总结 \color{red}{四、总结} 四、总结

        这章节内容没啥好说的,都是基础的内容,而且是一些未来咱们内容中会用到的基本技能,大家都需要知晓且掌握哈,有空的小伙伴可以先用这个内容练习一下基本功,熟悉记忆一下函数的参数代表什么意思,因为大家也发现了,一个函数的参数是真的多,多用用就记住了!


💖💖💖 持续更新,期待关注! \color{blue}{持续更新,期待关注!} 持续更新,期待关注!💖💖💖
我的资源: \color{purple}{我的资源:} 我的资源:我的资源

  1. IT技术各档次模板
  2. 各类项目(企业、毕设)
  3. 数据库安装包(Mysql8.0)
  4. 技能资料(电子书、软考等)

前文链接:【C++的OpenCV】第十四课-OpenCV基础强化(三):Mat元素的访问之data和step属性

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

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

相关文章

Redo Log(重做日志)的刷盘策略

1. 概述 Redo Log&#xff08;重做日志&#xff09;是 InnoDB 存储引擎中的一种关键组件&#xff0c;用于保障数据库事务的持久性和崩溃恢复。InnoDB 将事务所做的更改先记录到重做日志&#xff0c;之后再将其应用到磁盘上的数据页。 刷盘策略&#xff08;Flush Policy&#x…

基于CMFB余弦调制滤波器组的频谱响应matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、CMFB余弦调制滤波器组原理 4.2、CMFB调制过程 4.3、CMFB特点 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................…

【go channel管道】

1.channel是什么 在Go语言中&#xff0c;Channel是一种用于在Goroutine之间进行通信的数据结构。它类似于队列&#xff0c;可以在一个Goroutine中将数据发送到Channel&#xff0c;然后在另一个Goroutine中接收这些数据。Channel提供了一种同步的方式&#xff0c;确保发送和接收…

深入浅出Django的MTV架构

在现代Web应用程序开发中&#xff0c;采用一种模式或架构以组织代码和功能是至关重要的。在Django中&#xff0c;这种模式被称为MTV模式&#xff0c;即模型&#xff08;Model&#xff09;、模板&#xff08;Template&#xff09;和视图&#xff08;View&#xff09;。尽管它与传…

若依笔记(三):权限控制与数据隔离

目录 数据隔离/权限控制 用户/权限/部门/岗位 ​数据隔离 mybatis的maaper写法 注解和切面 前端路由拦截 已知若依单体的前端采用vue-element-admin&#xff0c;在前端的专栏系列vue-element-admin的动态路由已详细拆解&#xff0c;其最大特点是使用后端返回数据控制前端…

工业级环网交换机如何使用

工业级环网交换机是用于工业环境中的网络通信设备&#xff0c;具有高可靠性、耐用性和适应恶劣环境的特点。下面是一般的使用步骤&#xff1a; 1. 确保交换机的电源供应稳定并连接好电源线。 2. 将需要连接的网络设备&#xff08;如计算机、服务器、传感器等&#xff09;通过以…

ssh远程登录服务

目录 1.1版本协商阶段 1.2密钥和算法协商阶段 1.3认证阶段(两种认证方法): 2.1.安装ssh 2.2.配置文件分析: 3.1配置ssh监听端口号 3.2拒绝以root身份登录服务器 3.3虚拟机之间实现免密登录 3.4xshell免密登录 SSH (Secure Shell Protocol,安全壳程序协议)由IETF的网络…

模电学习路径

交流通路实质 列出电路方程1&#xff0c;方程1对时刻t做微分 所得方程1‘ 即为 交流通路 方程1对时刻t做微分&#xff1a;两个不同时刻的方程1相减&#xff0c;并 令两时刻差为 无穷小 微分 改成 差 模电学习路径&#xff1a; 理论 《电路原理》清华大学 于歆杰 朱桂萍 陆文…

透析远程办公效率低下的原因,这些问题有解决方法

远程办公是近年来越来越受欢迎的一种工作方式&#xff0c;许多人喜欢在家中或咖啡馆里工作&#xff0c;享受更自由的工作时间和空间。然而&#xff0c;远程办公也经常面临效率低下的问题&#xff0c;因为一些原因导致在办公室时高效率的工作方式在远程工作上不再适用。 首先&a…

【向生活低头】win7打印机共享给win11使用,win11无法连接问题的解决

打印机是跟win7的电脑连接的&#xff0c;然后试了很多方法&#xff0c;win11都没法添加该打印机去使用。 网上的方法乱七八糟啥都有&#xff0c;但试了以后&#xff0c;发现基本没什么用。 刚刚发现知乎上的一个回答是有用的&#xff0c;这里做记录以备后用。 1.打开控制面板的…

Linux 调试 (objdump/strace/strings)

目录 1. Linux 调试 (objdump/strace/strings)1.1. 查看系统 glibc 版本号1.2. 查看 so/bin 中的依赖1.3. 调试 bin 报错原因1.4. 查看 so/bin 中字符串 1. Linux 调试 (objdump/strace/strings) 1.1. 查看系统 glibc 版本号 1. 第一种 # ldd --version ldd (Ubuntu GLIBC 2.…

修复国产电脑麒麟系统开机出现initramfs 问题

目录预览 一、问题描述二、原因分析三、解决方案四、知识点呀initramfsBusyBox 五、参考链接 一、问题描述 国产麒麟系统出现 initramfs 模式 二、原因分析 一般在拷贝卡顿过程【强制关机】或者电【脑异常断电】的情况下概率性导致系统分区损坏&#xff0c;重启后大概率就会进…

数字孪生技术:金融业合规与自动化的未来

在当今数字化时代&#xff0c;金融行业正积极探索数字孪生技术&#xff0c;以实现更高效的运营和更好的客户体验。数字孪生是一种将实体世界的对象、过程和系统数字化为虚拟模型的技术&#xff0c;金融机构正在充分利用它带来的众多优势。 1. 风险管理与模拟 数字孪生模型可用…

解决ECharts柱形图自定义单个柱子颜色图例无法显示

legend里data和series里的name需要对应series里对象需要设置stack属性&#xff0c;属性值都一样即可显示单柱重点在于series里对象data属性设置&#xff0c;必须使用&#xff0c;否则影响柱体上数值显示tooltip的值需要自定义&#xff0c;否则会显示堆叠柱状图的tooltip格式&am…

Linux解决nvcc -V出现的-bash: nvcc command not found问题

两种解决办法&#xff1a; 1、第一种直接在bashrc文件中添加本地cuda路径&#xff1a; vim ~/.bashrc 定位到内容末尾&#xff0c;最末尾 添加命令&#xff1a; export LD_LIBRARY_PATH/usr/local/cuda/lib export PATH$PATH:/usr/local/cuda/bin添加后激活 source ~/.bashrc…

Ubuntu:解决PyCharm中不能输入中文或者输入一个中文解决方法

1.问题&#xff1a; Ubuntu22.04中&#xff0c;在pycharm里打字输入中文&#xff0c;每次都是只能输入第一个中文&#xff0c;后面输入的都变成了英文字母。。。无论咋调输入法&#xff0c;都没用&#xff0c;反正除了第一个字其他的输进去都是英文&#xff0c;而且汉字下面还…

软考 系统架构设计师系列知识点之设计模式(12)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之设计模式&#xff08;11&#xff09; 所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第2节. 设计模式实例 11. 某公司开发一个文档编辑器&#xff0c;改变及其允许在文档中直接嵌入…

2023年【R1快开门式压力容器操作】试题及解析及R1快开门式压力容器操作模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年【R1快开门式压力容器操作】试题及解析及R1快开门式压力容器操作模拟试题&#xff0c;包含R1快开门式压力容器操作试题及解析答案和解析及R1快开门式压力容器操作模拟试题练习。安全生产模拟考试一点通结合国家…

Java 线程池规范

目录 1、为什么要使用线程池&#xff1f;2、线程池如何命名3、不要使用 Executors 下自带线程池4、Async 正确用法5、项目中可以定义多个线程池吗&#xff1f; 1、为什么要使用线程池&#xff1f; 在使用多线程时&#xff0c;频繁地创建和销毁线程会带来显著的性能开销。使用线…

论文 辅助笔记:t2vec train.py

1 train 1.1 加载training和validation数据 def train(args):logging.basicConfig(filenameos.path.join(args.data, "training.log"), levellogging.INFO)设置了日志的基本配置。将日志信息保存到名为 "training.log" 的文件中日志的级别被设置为 INFO&…