您好,登录后才能下订单哦!
这篇文章主要为大家分析了Qt+OpenCV联合开发中图像的创建与赋值是怎样的的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“Qt+OpenCV联合开发中图像的创建与赋值是怎样的”的知识吧。
1、Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类,它mat分为头部(包括图像的大小、宽高、类型、通道数等)和数据部分(像素的值的集合)
2、获取的mat对象赋值给另一个对象时候,相当于把这个指针重新指向原来的数据,实质上还是指向同一个DataBlock。只有在进行克隆或者拷贝的时候,才会把这个Mat中所有的数据复制一份供你使用。Mat基本结构如图所示。
补充:
1、数据部分主要包含图像的像素数据,各个像素点的像素值。若单通道,每个像素点只有一个值;若三通道,每个像素点有三个值。
2、Mat 对象的创建有多种方式:克隆、复制、赋值、构造函数。速度从快到慢:构造函数、赋值、复制、克隆
赋值法:赋值产生的对象与原赋值对象指向同一个内存地址Data Block。(浅拷贝)Copy/clone法:会产生的新内存对象,指向独立的Data Block。(深拷贝)构造函数:Mat img_constructe(src);//src为图片源地址
下面主要介绍图像的克隆及拷贝
Mat img_clone = src.clone();
c++原型:
参数一:OutputArray,目标矩阵(输出的图片)。
同以前一样,声明函数放在test1.h文件里,实现放在test1.cpp文件里
在main中测试
从下图可以看出,显示的两张图没什么区别
如图所示
此处zeros的函数原型:
参数一:size,矩阵(图像)大小。
参数二:type,图像类型
OpenCv的源代码中提到:(_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
CV_8UC1,CV_64FC3是枚举类型,所以这里的type可以是任何的预定义类型,结构如下:
CV_<bit_depth>(S|U|F)C<number_of_channels>1、bit_depth-----比特数-----代表8bite,16bites,32bites,64bites
如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位对应的就是CV_82、S|U|F--S--代表signed int---有符号整形
U--代表--unsigned int----无符号整形
F--代表--float---------单精度浮点型3、C<number_of_channels>----代表一张图片的通道数,比如:
1--灰度图片--grayImg---单通道图像
2--RGB彩色图像---------3通道图像
3--带Alph通道的RGB图像----4通道图像如果不带通道数的这些类型就是默认通道数为1。
例如,CV_8U就等同于CV_8UC1,CV_32S就等同于CV_32SC1。
将上述的代码修改成三通道后:
可以看出原矩阵从8×8变为了24×8,因为原来是单通道,而现在为3通道,代表着每个像素点包含了3个像素值,可以说明图像在Mat上面真正的宽度等于通道数乘以Mat定义矩阵的宽度,即3*8=24。
但是每个通道都为1的图不能用在三通道上,如图,结果就是每个像素点的第一个通道为1,其余通道都为0。
其实我们也可以对m3赋值,来改变他的第一个通道的值。
如果想要每个通道的值都为127,可以通过调用Scalar函数
区别:拷贝不会改变原对象,而赋值则m4一变m3也会随之改变
关于“Qt+OpenCV联合开发中图像的创建与赋值是怎样的”就介绍到这了,更多相关内容可以搜索亿速云以前的文章,希望能够帮助大家答疑解惑,请多多支持亿速云网站!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。