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

这篇具有很好参考价值的文章主要介绍了【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎉🎉🎉 欢迎各位来到小白 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中的一些形式完成快速创建

这里边内容真不少:
【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
当然其中不是每个内容都需要大家去掌握,这里为大家整理和介绍一种非常常用的方法,如果这个可以掌握剩下都是可以无师自通的!

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

案例一:

#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
	Mat img(Size(512, 512), CV_8UC3, Scalar(0, 0, 0));
	return 0;
}

这里使用的是这个函数原型:
【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
        这样就可以完成一个任意颜色,任意大小图片且通道数任意的图像,非常方便好用!

稍微解释一下:

  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;
}

        这里使用的是这个函数原型:
【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
同样这也可以完成一个黑色图像的创建,解释一下:

  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的构造函数完成图像的创建的,而这也是一种非常常用的方法!
        这里用到的是这个函数原型:
【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言

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

  • 首先,这个方法为什么叫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位浮点四通道图像

        它也有其他的使用方法,但是大同小异:
【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言

(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:线型
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • 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]]]	) -> 	img
	cv.rectangle(	img, rec, color[, thickness[, lineType[, shift]]]	) -> 	img

解释一下:

  • img:画线的图像,即画在哪个图像上
  • pt1:左上顶点的位置
  • pt2:右下顶点的位置(通过左上和右下顶点就可以得出长方形的宽高)
  • color:暂时理解为颜色即可,后续内容会为大家持续更新
  • thickness:线宽,即线的粗细,如果为负数,即向内填充,实心色长方形
  • lineType:线型
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • 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]]]	) -> 	img
	cv.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:线型
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • 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:线型
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • 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:字体,有如下几种字体可选:
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • fontScale:字体缩放因子,即OpenCV的字体有一个默认大小,你可以基于这个大小设置字体的大小,是一个double类型的值,使用方法:默认字体大小*fontScale。
  • color:字体颜色
  • thickness:线宽,即字体的粗细,
  • lineType:线型
    【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介,openCV,c++,opencv,开发语言
  • 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属性文章来源地址https://www.toymoban.com/news/detail-737549.html

到了这里,关于【C++的OpenCV】第十五课-OpenCV的绘图工具(rectangle、circle、line、polylines、putText)常用方法简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【第十五课】数据结构:堆(acwing-839模拟堆 / ph和hp数组的映射关系 /c++代码 )

    目录 注意点  代码如下  上篇已经详细解释过堆的内容,需要可以回顾一下。 【第十五课】数据结构:堆 这里关注这道题提出几个注意点。  这道题有几个需要注意的点: ①没有事先给出完整的数组,而是靠我们一次次操作进行插入。因此,要定义一个size变量记录插入数

    2024年01月25日
    浏览(39)
  • opencv-python库 cv2 图形绘制 cv2.line()cv2.rectangle()cv2.circle()cv2.ellipse()cv2.polylines()cv2.putText

    cv2.line() 是 OpenCV 中的一个函数,用于在图像上绘制直线。这个函数需要指定图像、线的起点和终点坐标、线的颜色、线的宽度以及线的类型。 下面是 cv2.line() 函数的详细参数说明: 参数解释: 下面是一个使用 cv2.line() 绘制直线的简单示例: 在这个例子中,我们创建了一个

    2024年04月23日
    浏览(51)
  • 【第二十五课】动态规划:完全背包问题(acwing-3 / 公式推导 / 思路理解 / 优化 / c++代码)

    目录 思路 朴素代码 优化 公式推导上  二维代码  一维代码 公式理解上   在开始看完全背包问题之前,可能需要先了解01背包及其解决办法。 指路👇 【第二十五课】动态规划:01背包问题(acwing-2 / 思路 / 含一维数组优化 / c++代码) 这个问题和01背包的区别就是 每件物品可以

    2024年03月19日
    浏览(64)
  • 【小黑嵌入式系统第十五课】μC/OS-III程序设计基础(四)——消息队列(工作方式&数据通信&生产者消费者模型)、动态内存管理、定时器管理

    上一课: 【小黑嵌入式系统第十四课】μC/OS-III程序设计基础(三)——信号量(任务同步资源同步)、事件标记组(与或多个任务) 下一课: 【小黑嵌入式系统第十六课】PSoC 5LP第三个实验——μC/OS-III 综合实验 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣

    2024年01月17日
    浏览(51)
  • 【OpenCV】第十五章: 模板匹配

    第十五章: 模板匹配 模板匹配就是在给定的图片中查找和模板最相似的区域。 实现的方法是:将模板在图片上滑动(从左向右,从上向下),遍历所有滑窗,计算匹配度,将所有计算结果保存在一个矩阵种,并将矩阵中匹配度最高的值作为匹配结果。 一、单模板匹配 1、匹配函

    2024年02月02日
    浏览(44)
  • [halcon] 局部图片保存 gen_circle 和 gen_rectangle2 对比 这怕不是bug吧

    我想实现一个功能,获取图片中瑕疵的位置,将瑕疵周边的一块区域抠图并保存。 一开始我代码这么写的: gen_circle (Rectangle, Row[i], Column[i], 256) reduce_domain(Image,Rectangle,GrayEllipse) crop_domain(GrayEllipse, ImagePart1) write_image(ImagePart1, ‘bmp’, 0, ‘monk01.bmp’) 因为 gen_circle 指定的是半径

    2024年02月11日
    浏览(40)
  • C++第十五弹---string基本介绍(一)

     ✨ 个人主页:  熬夜学编程的小林 💗 系列专栏:  【C语言详解】   【数据结构详解】 【C++详解】 目录 1、什么是STL 2、STL的版本 3、STL的六大组件 4、STL的重要性 5、如何学习STL 6、STL的缺陷 7、为什么学习string类 7.1、C语言中的字符串 7.2、两个面试题 8、标准库中的stri

    2024年04月13日
    浏览(32)
  • 路由器(第二十五课)

    1、路由 1) 什么是路由:路由就是数据包从一个网络到另外一外网络的过程 2)支持路由功能的设备:路由器、三层交换机、防火墙 3 路由器转发数据包的依据: -每一台路由器都维护着一张路由表 -路由器是依靠这张路由表来转发数据的 -这张路由表就类似于我们生活中的地

    2024年02月15日
    浏览(59)
  • Halcon区域形状特征-area_center、area_holes、select_shape、inner_circle和smallest_rectangle2算子

    提示:文章参考了网络上其他作者的文章,以及相关书籍,如有侵权,请联系作者。        在场景中选择物体的特征是图像测量或者识别的重要基础。区域的形状特征是非常常用的特征,在模式匹配中,常使用形状特征作为匹配的依据。下面就介绍几种常用的与区域形状

    2024年02月05日
    浏览(31)
  • 第十五届蓝桥杯模拟赛(第一期 C++)

    问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。    答案: 2730 思路分析: 直接暴力秒了 问题描述 在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包