聊聊Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值問題
一、Mat基本結(jié)構(gòu)
1、Mat不但是一個非常有用的圖像容器類,同時也是一個通用的矩陣類,它mat分為頭部(包括圖像的大小、寬高、類型、通道數(shù)等)和數(shù)據(jù)部分(像素的值的集合)
2、獲取的mat對象賦值給另一個對象時候,相當(dāng)于把這個指針重新指向原來的數(shù)據(jù),實質(zhì)上還是指向同一個DataBlock。只有在進行克隆或者拷貝的時候,才會把這個Mat中所有的數(shù)據(jù)復(fù)制一份供你使用。Mat基本結(jié)構(gòu)如圖所示。

補充:
1、數(shù)據(jù)部分主要包含圖像的像素數(shù)據(jù),各個像素點的像素值。若單通道,每個像素點只有一個值;若三通道,每個像素點有三個值。
2、Mat 對象的創(chuàng)建有多種方式:克隆、復(fù)制、賦值、構(gòu)造函數(shù)。速度從快到慢:構(gòu)造函數(shù)、賦值、復(fù)制、克隆
賦值法:賦值產(chǎn)生的對象與原賦值對象指向同一個內(nèi)存地址Data Block。(淺拷貝)Copy/clone法:會產(chǎn)生的新內(nèi)存對象,指向獨立的Data Block。(深拷貝)構(gòu)造函數(shù):Mat img_constructe(src);//src為圖片源地址
下面主要介紹圖像的克隆及拷貝
二、圖像的克隆及拷貝
1、clone函數(shù)
Mat img_clone = src.clone();
2、copyTo函數(shù)
c++原型:
參數(shù)一:OutputArray,目標(biāo)矩陣(輸出的圖片)。
3、示例
同以前一樣,聲明函數(shù)放在test1.h文件里,實現(xiàn)放在test1.cpp文件里

在main中測試

從下圖可以看出,顯示的兩張圖沒什么區(qū)別

三、創(chuàng)建圖像
1、創(chuàng)建空白圖像:

如圖所示

此處zeros的函數(shù)原型:
參數(shù)一:size,矩陣(圖像)大小。
參數(shù)二:type,圖像類型
OpenCv的源代碼中提到:(_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
CV_8UC1,CV_64FC3是枚舉類型,所以這里的type可以是任何的預(yù)定義類型,結(jié)構(gòu)如下:
CV_<bit_depth>(S|U|F)C<number_of_channels>1、bit_depth-----比特數(shù)-----代表8bite,16bites,32bites,64bites
如果你現(xiàn)在創(chuàng)建了一個存儲--灰度圖片的Mat對象,這個圖像的大小為寬100,高100,那么,現(xiàn)在這張灰度圖片中有10000個像素點,它每一個像素點在內(nèi)存空間所占的空間大小是8bite,8位對應(yīng)的就是CV_82、S|U|F--S--代表signed int---有符號整形
U--代表--unsigned int----無符號整形
F--代表--float---------單精度浮點型3、C<number_of_channels>----代表一張圖片的通道數(shù),比如:
1--灰度圖片--grayImg---單通道圖像
2--RGB彩色圖像---------3通道圖像
3--帶Alph通道的RGB圖像----4通道圖像如果不帶通道數(shù)的這些類型就是默認通道數(shù)為1。
例如,CV_8U就等同于CV_8UC1,CV_32S就等同于CV_32SC1。
將上述的代碼修改成三通道后:

可以看出原矩陣從8×8變?yōu)榱?4×8,因為原來是單通道,而現(xiàn)在為3通道,代表著每個像素點包含了3個像素值,可以說明圖像在Mat上面真正的寬度等于通道數(shù)乘以Mat定義矩陣的寬度,即3*8=24。
2、創(chuàng)建通道都為1的圖:


但是每個通道都為1的圖不能用在三通道上,如圖,結(jié)果就是每個像素點的第一個通道為1,其余通道都為0。

其實我們也可以對m3賦值,來改變他的第一個通道的值。

如果想要每個通道的值都為127,可以通過調(diào)用Scalar函數(shù)


3、拷貝和賦值的區(qū)別

3.1用Scalar函數(shù)設(shè)置m3對象為綠色

3.2m3賦值給m4,m4改為黃色

3.3拷貝m3給m4,m4改為黃色

區(qū)別:拷貝不會改變原對象,而賦值則m4一變m3也會隨之改變
原創(chuàng)不易,轉(zhuǎn)載請注明出處:
https://blog.csdn.net/hml111666/article/details/122696593
CV_8UC1,CV_32FC3等參數(shù)的含義參考鏈接:
https://blog.csdn.net/qq_37764129/article/details/82078255
到此這篇關(guān)于Qt+OpenCV聯(lián)合開發(fā)之圖像的創(chuàng)建與賦值的文章就介紹到這了,更多相關(guān)Qt+OpenCV聯(lián)合開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- OpenCV c++滑動條的創(chuàng)建和使用代碼
- Opencv創(chuàng)建車牌圖片識別系統(tǒng)方法詳解
- 使用Android Studio創(chuàng)建OpenCV4.1.0 項目的步驟
- VS2019/2022配置C++ OpenCV4.10.0環(huán)境的圖文步驟
- VisualStudio2022配置opencv的實現(xiàn)
- Java調(diào)用opencv IDEA環(huán)境配置的教程詳解
- VisualStudio2022 cmake配置opencv開發(fā)環(huán)境
- Visual?Studio2022下Opencv的配置圖文教程
- Visual?Studio?2022下載及配置OpenCV4.5.5的詳細過程
- vs2019配置C++版OpenCV的方法步驟
- VisualStudio中OpenCV的創(chuàng)建與配置使用小結(jié)
相關(guān)文章
Qt使用QChart實現(xiàn)動態(tài)顯示溫度變化曲線
Qt的QChart是一個用于繪制圖表和可視化數(shù)據(jù)的類,提供了一個靈活的、可擴展的、跨平臺的圖表繪制解決方案,所以本文就將使用QChart實現(xiàn)動態(tài)顯示3個設(shè)備的溫度變化曲線,感興趣的可以了解一下2023-06-06
C語言實現(xiàn)班級檔案管理系統(tǒng)課程設(shè)計
這篇文章主要為大家詳細介紹了C語言實現(xiàn)班級檔案管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12
C/C++實現(xiàn)通訊錄管理系統(tǒng)(附源碼)
這篇文章主要為大家詳細介紹了如何利用C++實現(xiàn)通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-12-12
VC6.0打開文件以及向工程中添加文件時程序崩潰自動退出解決方法
vc6.0程序中,點擊打開文件以及向工程中添加文件時,程序竟然崩潰自動退出了,不知什么原因,安裝相同的vc程序,本本竟然出現(xiàn)此緣故2013-01-01



