三、C++中的Mat对象

news2024/12/25 23:34:39

图片在C++中是作为矩阵Matrix进行处理对待的,通过Mat数据类型进行处理
在这里插入图片描述
新建项目这里就不再赘述了哈,可以参考博文:零、环境搭建(第三部分Visula Studio中新建项目)
我这边创建的项目名称为:1_31_matrix

为了养成良好的项目开发习惯,对于某些功能的实现都重新定义一个头文件,然后再创建一个新的文件去实现头文件中所定义的类中所有的方法,最后通过项目的主文件进行调用即可

一、创建头文件

在项目的头文件中,右击添加新建项
在这里插入图片描述
创建Mat对象头文件,我这边是mat_attribute.h
在这里插入图片描述
该头文件声明了一个Matrices类(class Matrices),该类下面声明一个函数(void mat_create(Mat& image))

mat_attribute.h头文件内容如下:

#pragma once

#include <opencv2/opencv.hpp>

using namespace cv;

class Matrices {
	public:
		void mat_create(Mat& image);
};

二、实现头文件中创建的类中的方法

创建个文件,用于实现头文件中Matrices类中的mat_create函数
我这个文件是:matrices.cpp
在这里插入图片描述
在这里插入图片描述

Ⅰ,新建图片

1,创建一张单颜色通道全为0的8×8图片

#include"mat_attribute.h",导入自定义的头文件
#include <opencv2/opencv.hpp>,因为要显示图片,导入opencv

Mat::zeros(Size(8, 8), CV_8UC1)
参数一:zeros(),全为零
参数二:Size(8, 8),图片大小8×8
参数三:CV_8UC1,8位(8)、无符号字符(unsigned char,UC)、单通道(1)

namedWindow("new_8*8*1_zeros", WINDOW_FREERATIO);,创建一个新的窗体命名为new_8*8*1_zeros,窗体显示为自适应WINDOW_FREERATIO

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::zeros(Size(8, 8), CV_8UC1);

	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*1_zeros", WINDOW_FREERATIO);
	imshow("new_8*8*1_zeros", y1);
	waitKey(0);
	destroyAllWindows();

}

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

2,创建一张三颜色通道全为0的8×8图片

同理,全为0的8×8三通图片就可以通过Mat::zeros(Size(8, 8), CV_8UC3);进行实现,这里需要注意是,图片以矩阵进行展示,竖着切,下面这个图应该可以很好的展示C++中mat通过二维数组进行展示的像素点值
在这里插入图片描述

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::zeros(Size(8, 8), CV_8UC3);

	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*3_zeros", WINDOW_FREERATIO);
	imshow("new_8*8*3_zeros", y1);
	waitKey(0);
	destroyAllWindows();

}

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

3,创建一张单颜色通道全为1的8×8图片

到这里可能会有同学根据第一个样例,比葫芦画瓢进行这个样例的改写了,Mat::ones(Size(8, 8), CV_8UC1);,没毛病!

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC1);

	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*1_ones", WINDOW_FREERATIO);
	imshow("new_8*8*1_ones", y1);
	waitKey(0);
	destroyAllWindows();

}

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

4,创建一张三颜色通道全为1的8*8图片

①,若通过ones进行创建三颜色通道全为1图片,仅仅给第一个通道全赋值为1而已,其余连个颜色通道像数值还是0

同理,比葫芦画瓢进行这个样例的改写了,Mat::ones(Size(8, 8), CV_8UC3);,有问题!!!!

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);

	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*3_ones", WINDOW_FREERATIO);
	imshow("new_8*8*3_ones", y1);
	waitKey(0);
	destroyAllWindows();

}

效果图如下:
在这里插入图片描述
可以看到,出现了问题,只有一个通道被赋值给了1,其他的俩通道还是0

②,通过直接给mat赋值的方法,也仅仅针对的是第一个颜色通道进行赋值,其他颜色通道数值仍为0

如果直接对这个mat赋值(y1 = 128;)的话,也仅仅针对的是第一个通道进行赋值

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);
	y1 = 128;
	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*3_ones", WINDOW_FREERATIO);
	imshow("new_8*8*3_ones", y1);
	waitKey(0);
	destroyAllWindows();

}

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

③,Scalar()函数对三个通道赋值

y1 = Scalar(128,128,128);,该函数可以实现对三个颜色通道依次赋值,三个参数分别为BGR三颜色通道的值
为了演示效果明显,采用灰度图(128,128,128)进行测试

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);
	y1 = Scalar(128,128,128);
	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;

	namedWindow("new_8*8*3_ones", WINDOW_FREERATIO);
	imshow("new_8*8*3_ones", y1);
	waitKey(0);
	destroyAllWindows();

}

效果图如下:
在这里插入图片描述
该方法可以满足对三颜色通道全部进行设置的操作

Ⅱ,赋值操作(=)

赋值操作=,可以理解为浅拷贝,指向的是同一个对象
y1 = Scalar(128,128,128);,可以看到y1是灰度图
y2 = y1;,赋值之后y1和y2其实同一个内存数据
y2 = Scalar(255,0,0);,改变y2时,y1也发生了改变,展示y1和y2时,都是蓝色的图片,可以理解为浅拷贝,都是同一个对象

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);
	y1 = Scalar(128,128,128);
	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;
	
	Mat y2;
	y2 = y1;
	y2 = Scalar(255,0,0);

	namedWindow("test1", WINDOW_FREERATIO);
	namedWindow("test2", WINDOW_FREERATIO);
	imshow("test1", y1);
	imshow("test2", y2);
	waitKey(0);
	destroyAllWindows();

}

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

Ⅲ,clone()函数

clone()就是深拷贝了,是两个完全不同的对象
y2 = y1.clone();,y1和y2是两个完全不同的对象了
y2 = Scalar(255,0,0);,操作y2时对y1没有影响

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);
	y1 = Scalar(128,128,128);
	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;
	
	Mat y2;
	y2 = y1.clone();
	y2 = Scalar(255,0,0);

	namedWindow("test1", WINDOW_FREERATIO);
	namedWindow("test2", WINDOW_FREERATIO);
	imshow("test1", y1);
	imshow("test2", y2);
	waitKey(0);
	destroyAllWindows();

}

在这里插入图片描述

Ⅳ,copyTo()函数

这个和clone()函数类似,都是深拷贝,独立成不同的空间
y1.copyTo(y2);,这里是y1拷贝给y2,将y1的内容全部独立开辟内存空间给y2,y1和y2是相互独立的
y2 = Scalar(255,0,0),改变y2,y1没有影响

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat y1 = Mat::ones(Size(8, 8), CV_8UC3);
	y1 = Scalar(128,128,128);
	std::cout << "width:" << y1.cols << " height:" << y1.rows << " channels:" << y1.channels() << std::endl;
	std::cout << y1 << std::endl;
	
	Mat y2;
	y1.copyTo(y2);//y1拷贝给y2,此处y1和y2一样,但是是两个完全独立的对象,深拷贝
	y2 = Scalar(255,0,0);
	
	namedWindow("test1", WINDOW_FREERATIO);
	namedWindow("test2", WINDOW_FREERATIO);
	imshow("test1", y1);
	imshow("test2", y2);
	waitKey(0);
	destroyAllWindows();

}

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

Ⅴ,构建mask掩膜操作

掩膜操作不陌生吧,Mat也可以进行构建mask,也方便opencv之后的一系列操作

#include"mat_attribute.h"
#include <iostream>
#include <opencv2/opencv.hpp>

void Matrices::mat_create() {

	Mat mask = (Mat_<char>(3, 3) << 0, -1, 0, 
		                           -1, 5, -1, 
		                           0, -1, 0);
	std::cout << "width:" << mask.cols << " height:" << mask.rows << " channels:" << mask.channels() << std::endl;
	std::cout << mask << std::endl;

	namedWindow("mask", WINDOW_FREERATIO);
	imshow("mask", mask);
	waitKey(0);
	destroyAllWindows();

}

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

三、主函数文件

同理,创建一个cpp文件,我这里以yy_main.cpp为例
在这里插入图片描述
在这里插入图片描述
#include "mat_attribute.h",导入自定义的头文件
Matrices yy;,对这个类进行赋予对象
yy.mat_create();,调用这个类中的mat_create()函数

#include <opencv2/opencv.hpp>
#include <iostream>
#include "mat_attribute.h"

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
	Matrices yy;
	yy.mat_create();
	return 0;
}

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

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

相关文章

ubuntu QT openssl支持https

1、Building Qt 5 from Git - Qt Wiki 2、下载编译对应的opengssl [ 1.1.1 ] - /source/old/1.1.1/index.html 3、安装所需基础工具 sudo apt-get install build-essential perl python3 git sudo apt-get install ^libxcb.*-dev libx11-xcb-dev libglu1-mesa-dev libxrende…

基于YOLOv8的水下生物检测,多种优化方法---MSAM(CBAM升级版)助力涨点(二)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了水下生物检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入自研注意力MSAM mAP0.5由原始的0.522提升至0.534…

Epicypher—SMARCA2 Chromatin Remodeling Enzyme (Human BRM)

EpiCypher是一家为表观遗传学和染色质生物学研究提供高质量试剂和工具的专业制造商。EpiCypher&#xff08;国内授权代理 欣博盛生物&#xff09;能提供全长重组人SMARCA2重塑酶。SMARCA2是ATP依赖性染色质重塑复合物SWI/SNF的核心ATP酶亚基&#xff0c;可动员核小体&#xff0…

第二百九十九回

文章目录 1. 概念介绍2. 实现方法2.1 使用Steam实现2.2 使用Timer实现 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何实现每隔一段时间执行某项目任务"相关的内容&#xff0c;本章回中将介绍如何实现倒计时功能.闲话休提&#xff0c;让我们一起Talk Flutter吧…

Elasticsearch:Geoshape query

Geoshape 查询可以用于过滤使用 geo_shape 或 geo_point 类型索引的文档。 geo_shape 查询使用与 geo_shape 或 geo_point 映射相同的索引来查找具有与查询形状相关的形状的文档&#xff0c;并使用指定的空间关系&#xff1a;相交&#xff08;intersect&#xff09;、包含(con…

【百度Apollo】本地调试仿真:加速自动驾驶系统开发的利器

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

【C++干货基地】C++引用与指针的区别:深入理解两者特性及选择正确应用场景

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

go并发编程-runtime、Channel与Goroutine

1. runtime包 1.1.1. runtime.Gosched() 让出CPU时间片&#xff0c;重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤&#xff0c;但是你妈让你去相亲,两种情况第一就是你相亲速度非常快&#xff0c;见面就黄不耽误你继续烧烤&#xff0c;第二种情况就是你相亲速度…

C#,入门教程(36)——尝试(try)捕捉(catch)不同异常(Exception)的点滴知识与源代码

上一篇&#xff1a; C#&#xff0c;入门教程(35)——哈希表&#xff08;Hashtable&#xff09;的基础知识与用法https://blog.csdn.net/beijinghorn/article/details/124236243 1、try catch 错误机制 Try-catch 语句包含一个后接一个或多个 catch 子句的 try 块&#xff0c;这…

项目:博客

1. 运行环境&#xff1a; 主机 主机名 系统 服务 192.168.223.129 Server_Web Linux Web 192.168.48.131 Server-NFS-DNS Linux NFS/DNS 2. 基础配置 配置主机名&#xff0c;静态IP地址 开启防火墙并配置 部分开启SElinux并配置 服务器之间使用同ntp.aliyun.com进行…

prometheus和alertmanager inhibit_rules抑制的使用

172.16.10.21 prometheus 172.16.10.33 altermanager 172.16.10.59 mysql服务&#xff0c;node探针以及mysql的探针 [rootk8s-node02 ~]# docker ps -a CONTAINER ID IMAGE …

SpringBoot+BCrypt算法加密

BCrypt是一种密码哈希函数&#xff0c;BCrypt算法使用“盐”来加密密码&#xff0c;这是一种随机生成的字符串&#xff0c;可以在密码加密过程中使用&#xff0c;以确保每次加密结果都不同。盐的使用增强了安全性&#xff0c;因为攻击者需要花费更多的时间来破解密码。 下图为…

深度剖析Sentinel热点规则

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深度剖析Sentinel热点规则 前言核心概念解析&#xff1a;数字守护者的起源核心概念解析&#xff1a;简单示例演示&#xff1a; 参数索引&#xff1a;规则的基石参数索引的作用&#xff1a;不同场景下选…

数学建模-灰色预测模型

灰色预测练习解答 x(0){183,189,207,234,220,256,270,285}; X(1){183,372,579,813,1033,1289,1559,1844}; Matlab操作程序: x0[183,189,207,234,220,256,270,285];>> format long; %(表示设计精度)>> nlength(x0); %&#xff08;输入数据长度&#xff09;>&g…

在 python 中调用 C/C++

Python 是一种很好用的胶水语言&#xff0c;利用Python的简洁和C的高效&#xff0c;基本可以解决99%的问题了&#xff0c;剩下那 1% 的问题也就不是问题了&#xff0c;毕竟不是所有问题都可解。 一般的&#xff0c;Python和C的交互分为这两种情况&#xff1a; 用C扩展Python&…

标准化编程系列(常用模式状态介绍)

任何事情任何编程都是有方法可循的,我们所要做的工作就是在看似没有规律的运行中,发现规律总结一般性的方法。这篇博客主要介绍标准化编程相关的基础知识,编程化编程离不开大家扎实的编程基本功,所以在学习标准化的同时,大家需要提升对于子程序,模块FB 、FC等的应用知识,…

Windows11通过Hyper-V创建VM,然后通过vscode连接vm进行开发

这边需要在win11上建立vm来部署docker(这边不能用windows版本的docker destop)&#xff0c;学习了下&#xff0c;记录。 下载系统镜像 首先下载系统镜像&#xff1a;https://releases.ubuntu.com/focal/ 这边使用的是ubuntu20.04.6 LTS (Focal Fossa) &#xff0c;Server inst…

D4800——AB类立体声耳机放大芯片, 输出电压振幅大,电源抑制比好且低功耗, 工作温度范围宽 无开关噪声

D4800是一块AB类立体声耳机音频功率放大器电路。D480在5V电源时输出功率最高可290mW(89负裁失真度1090.适合在便携式数字音响设备中作功率放大用。 主要特点&#xff1a; ● 电源电压:单电源: 2V to 7V 双电源:1.0V to3.5V ● 高信噪比: 100dB DIP8. ● 转速快: 5V/us ● 失…

【乳腺肿瘤诊断分类及预测】基于PNN概率神经网络

课题名称&#xff1a;基于PNN的乳腺肿瘤诊断分类及预测 版本日期&#xff1a;2023-06-15 运行方式: 直接运行PNN0501.m 文件即可 代码获取方式&#xff1a;私信博主或QQ&#xff1a;491052175 模型描述&#xff1a; 威斯康辛大学医学院经过多年的收集和整理&#xff0c;建…

关于Spring框架的 @Configuration 与@Service 加载顺序哪个先后(某些环境加载是随机的)

很多资料都说Configuration 优先加载&#xff0c;Service后加载&#xff0c;如下图&#xff1a; 本来也是以为 Configuration 优先加载于 Service &#xff0c;那参数处理放在Configuration注入完后&#xff0c;service构建时就可以拿来用的&#xff0c;在我在IDEA的调试时下断…