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

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


我的资源: \color{purple}{我的资源:} 我的资源:我的资源

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


前言 \color{purple}{前言} 前言

        如果你还不知道如何入门OpenCV,请先了解之前的所有文章,已经为大家归纳进专栏,大家可以按照顺序逐一学习!考虑到大家前边学了好多难以理解的内容,今天继续为大家归纳总结一些基础内容,方便大家更好的入门。

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


一、从创建一个图像开始 \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}{持续更新,期待关注!} 持续更新,期待关注!💖💖💖

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

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

相关文章

你知道什么是 Ping 吗?

欢迎到我的博客浏览 胤凯 (oyto.github.io) 这次我们来看一下什么是 Ping 操作&#xff0c;以及它有什么用处&#xff0c;并且我们来动手实现一个简易版的 Ping 工具。 Ping 是什么&#xff1f; ​ ping 是一个计算机网络工具&#xff0c;通常用于测试网络连接的可达性和测…

中文编程软件怎么下载,中文编程语言

中文编程软件怎么下载&#xff0c;中文编程语言 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;想如图这个实例就是用这个工具…

【MySQL】视图

文章目录 一. 基本使用二. 视图规则和限制结束语 视图是一个虚拟表&#xff0c;其内容由查询定义&#xff0c;同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。 视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图 一. 基本使用 创建视图 …

Linux系统jdkTomcatMySQL安装以及J2EE后端接口部署

目录 一、jdk&Tomcat安装 1.1 上传安装包到服务器 1.2 解压对应工具包 1.3 配置环境变量并测试jdk安装 1.4 启动tomcat 1.5 防火墙设置 1.5.1 开启/关闭防火墙以及防火墙状态查看 1.5.2 开放防火墙端口 二、MySQL安装 2.1 卸载mariadb 2.2 在线下载MySQL安装包(…

C++标准模板(STL)- 类型支持 (类型特性,is_union,is_class,is_function)

类型特性 类型特性定义一个编译时基于模板的结构&#xff0c;以查询或修改类型的属性。 试图特化定义于 <type_traits> 头文件的模板导致未定义行为&#xff0c;除了 std::common_type 可依照其所描述特化。 定义于<type_traits>头文件的模板可以用不完整类型实例…

PCL setCameraPosition 参数讲解

setCameraPosition 的原型如下void setCameraPosition (double pos_x, double pos_y, double pos_z,double view_x, double view_y, double view_z,double up_x, double up_y, double up_z, int viewport 0);pos_x pos_y pos_z为相机所在的位置view_x view_y view_z 是焦点所…

用前端框架Bootstrap的AdminLTE模板和Django实现后台首页的页面

承接博文 用前端框架Bootstrap和Django实现用户注册页面 继续开发实现 后台首页的页面。 01-下载 AdminLTE-3.1.0-rc 并解压缩 以下需要的四个文件夹及里面的文件百度网盘下载链接&#xff1a; https://pan.baidu.com/s/1QYpjOfSBJPmjmVuFZdSgFQ?pwdo9ta 下载 AdminLTE-3.1…

十种排序算法(1) - 准备测试函数和工具

1.准备工作 我们先写一堆工具&#xff0c;后续要用&#xff0c;不然这些写在代码里可读性巨差 #pragma once #include<stdio.h>//为C语言定义bool类型 typedef int bool; #define false 0 #define true 1//用于交互a和b inline void swap(int* a, int* b) {/*int c *a…

机器人入门(四)—— 创建你的第一个虚拟小车

机器人入门&#xff08;四&#xff09;—— 创建你的第一个虚拟小车 一、小车建立过程1.1 dd_robot.urdf —— 建立身体1.2 dd_robot2.urdf —— 添加轮子1.3 dd_robot3.urdf —— 添加万向轮1.4 dd_robot4.urdf —— 添加颜色1.5 dd_robot5.urdf —— 添加碰撞检测(Collision …

在pycharm中,远程操作服务器上的jupyter notebook

一、使用场景 现在我们有两台电脑&#xff0c;一台是拥有高算力的服务器&#xff0c;另一台是普通的轻薄笔记本电脑。如何在服务器上运行jupyter notebook&#xff0c;同时映射到笔记本电脑上的pycharm客户端中进行操作呢&#xff1f; 二、软件 pycharm专业版&#xff0c;jupy…

打造美团外卖新体验,HarmonyOS SDK持续赋能开发者共赢鸿蒙生态

从今年8月起&#xff0c;所有升级到HarmonyOS 4的手机用户在美团外卖下单后&#xff0c;可通过屏幕上的一个“小窗口”&#xff0c;随时追踪到“出餐、取餐、送达”等订单状态。这个能让用户实时获悉订单进度的神奇“小窗口”&#xff0c;就是实况窗功能。 实况窗&#xff1a;简…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建

涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis …

843. n-皇后问题

文章目录 QuestionIdeasCode Question n− 皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上&#xff0c;使得皇后不能相互攻击到&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n &#xff0c;请你输出所有的满足条件的棋子摆法。 输入格…

心理咨询预约小程序

随着微信小程序的日益普及&#xff0c;越来越多的人开始关注如何利用小程序来提供便捷的服务。对于心理咨询行业来说&#xff0c;搭建一个心理咨询预约小程序可以大大提高服务的效率和用户体验。本文以乔拓云平台为例&#xff0c;详细介绍如何轻松搭建一个心理咨询预约小程序。…

辅助驾驶功能开发-功能规范篇(22)-6-L2级辅助驾驶方案功能规范

1.3.6 ELK 系统功能定义 ELK全称Emergency Lane Keeping,即紧急车道保持。当车辆与道路边界护栏(包含隔离带护栏、路锥、水马) 有碰撞危险或当车辆正偏出道路边沿且存在“对向来车”或“后向来车”与本车有碰撞风险时,通过给与转向反力矩进行车辆横向运动介入控制,避免或减…

态路小课堂丨如何为QSFP-DD800G光模块选择合适的光纤跳线

TARLUZ态路 在之前2篇文章中&#xff0c;我们介绍了关于800G光模块的封装、光口类型等内容。本文态路通信将为您介绍“如何为QSFP-DD800G光模块选择合适的光纤跳线”。方便您在800G数据中心网络互连场景中快速完成链路布线。 文章1&#xff1a; 三款800G光模块方案介绍—SR8/…

【AIFEM案例操作】水泵强度分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

写博客的模板

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》作者 公众号&#xff1a;山峯草堂&#xff0c;非技术多篇文章&#xff0c;专注于天道酬勤的 Java 开发问题、中国国学、传统文化和代码爱好者的程序人生&#xff0c;…

总感觉戴助听器耳朵又闷又堵怎么办?

随着助听器技术的进步发展&#xff0c;这些问题都有了一定程度的改善。例如&#xff0c;现在的助听器变得越来越小巧&#xff0c;外形更加美观和隐蔽&#xff1b;各种降噪技术和验配技巧也提升了助听器的音质和清晰度。 但是&#xff0c;还有一个问题困扰着很多助听器用户&…

linux的使用学习(1)

Linux 修改root密码 1.以 root 用户或具有 sudo 权限的登录到 Linux 系统。 2.打终端&#xff0c;并执行以下命令以更改 root 用户的密码&#xff1a; sudo passwd root 3.然后&#xff0c;系统会要求你输入新的 root 密码。请注意&#xff0c;在输入密码时&#xff0c;终端界…