服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

2022-09-07 15:24hml111666 C/C++

这篇文章主要介绍了Qt+OpenCV联合开发之图像的创建与赋值问题,给大家介绍了图像的克隆及拷贝问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、Mat基本结构

1、Mat不但是一个非常有用的图像容器类,同时也是一个通用的矩阵类,它mat分为头部(包括图像的大小、宽高、类型、通道数等)和数据部分(像素的值的集合)

2、获取的mat对象赋值给另一个对象时候,相当于把这个指针重新指向原来的数据,实质上还是指向同一个DataBlock。只有在进行克隆或者拷贝的时候,才会把这个Mat中所有的数据复制一份供你使用。Mat基本结构如图所示。

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 补充:

1、数据部分主要包含图像的像素数据,各个像素点的像素值。若单通道,每个像素点只有一个值;若三通道,每个像素点有三个值。

2、Mat 对象的创建有多种方式:克隆、复制、赋值、构造函数。速度从快到慢:构造函数、赋值、复制、克隆

赋值法:赋值产生的对象与原赋值对象指向同一个内存地址Data Block。(浅拷贝)Copy/clone法:会产生的新内存对象,指向独立的Data Block。(深拷贝)构造函数:Mat img_constructe(src);//src为图片源地址

下面主要介绍图像的克隆及拷贝 

 

 二、图像的克隆及拷贝

 

1、clone函数

Mat img_clone = src.clone();

 

2、copyTo函数

c++原型:

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 参数一:OutputArray,目标矩阵(输出的图片)。

 

3、示例

同以前一样,声明函数放在test1.h文件里,实现放在test1.cpp文件里

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

在main中测试

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

从下图可以看出,显示的两张图没什么区别

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 

 三、创建图像

 

1、创建空白图像:

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 如图所示

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 此处zeros的函数原型:

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

  参数一: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_8

 2、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。

 将上述的代码修改成三通道后:

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 可以看出原矩阵从8×8变为了24×8,因为原来是单通道,而现在为3通道,代表着每个像素点包含了3个像素值,可以说明图像在Mat上面真正的宽度等于通道数乘以Mat定义矩阵的宽度,即3*8=24。

 

2、创建通道都为1的图:

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

但是每个通道都为1的图不能用在三通道上,如图,结果就是每个像素点的第一个通道为1,其余通道都为0。

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

其实我们也可以对m3赋值,来改变他的第一个通道的值。

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

如果想要每个通道的值都为127,可以通过调用Scalar函数

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 

 3、拷贝和赋值的区别

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 

3.1用Scalar函数设置m3对象为绿色

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 

 3.2m3赋值给m4,m4改为黄色

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

 

3.3拷贝m3给m4,m4改为黄色

聊聊Qt+OpenCV联合开发之图像的创建与赋值问题

区别:拷贝不会改变原对象,而赋值则m4一变m3也会随之改变

 原创不易,转载请注明出处:

https://blog.csdn.net/hml111666/article/details/122696593

CV_8UC1,CV_32FC3等参数的含义参考链接:

https://blog.csdn.net/qq_37764129/article/details/82078255

到此这篇关于Qt+OpenCV联合开发之图像的创建与赋值的文章就介绍到这了,更多相关Qt+OpenCV联合开发内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/hml111666/article/details/122696593

延伸 · 阅读

精彩推荐
  • C/C++矩阵的行主序与列主序的分析

    矩阵的行主序与列主序的分析

    这篇文章主要介绍了矩阵的行主序与列主序的分析的相关资料,需要的朋友可以参考下...

    C语言教程网7042021-05-21
  • C/C++C语言使用回溯法解旅行售货员问题与图的m着色问题

    C语言使用回溯法解旅行售货员问题与图的m着色问题

    回溯法即是在按条件搜索走不通的情况下退回再选择其他路线的方法,这里我们来看C语言使用回溯法解旅行售货员问题与图的m着色问题的方法示例:...

    Hi_Aaron12272021-04-08
  • C/C++C++类模板与模板类深入详解

    C++类模板与模板类深入详解

    这篇文章主要介绍了C++类模板与模板类深入详解,需要的朋友可以参考下...

    C++教程网4642021-01-22
  • C/C++使用Clion刷LeetCode的方法

    使用Clion刷LeetCode的方法

    这篇文章主要介绍了使用Clion刷LeetCode的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    FILWY_M6442021-10-22
  • C/C++QT5实现UDP通信的示例代码

    QT5实现UDP通信的示例代码

    本文主要介绍了QT5实现UDP通信的示例代码,主要使用QUdpSocket类用于实现UDP通信,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴...

    GG_ber5952022-07-11
  • C/C++C语言的字符空间与非字符空间你了解吗

    C语言的字符空间与非字符空间你了解吗

    这篇文章主要介绍了C语言的字符空间与非字符空间,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助...

    宝全哥哥11362021-12-23
  • C/C++详解C语言之单链表

    详解C语言之单链表

    这篇文章主要为大家介绍了C语言的单链表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助...

    ぃ咔哇依°ヽ11702022-02-25
  • C/C++C++11并发编程:多线程std::thread

    C++11并发编程:多线程std::thread

    今天小编就为大家分享一篇关于C++11并发编程:多线程std::thread,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编...

    蜗牛2016832021-07-14