當前位置:網站首頁>Opencv -- 003 Mat對象的創建與賦值
Opencv -- 003 Mat對象的創建與賦值
2022-01-27 06:25:19 【xuechanba】
1、一個Mat對象(圖片)包含頭部和數據部分兩部分信息。
2、當使用賦值方式時,並不會重新開辟一塊空間來存儲這張圖片的信息。Mat還有一個克隆/拷貝方法,當調用這兩個方法時,才會將另外開辟一塊空間來存儲這張圖片的信息。
如何調用拷貝和克隆方法。
void QuickDemo::mat_creation_demo(Mat& image)
{
Mat m1,m2;
//克隆方法
m1 = image.clone();
//拷貝方法
image.copyTo(m2);
}
如何創建空白圖像。
void QuickDemo::mat_creation_demo()
{
//zeros -- 用於創建空白圖像
//Returns a zero array of the specified size and type.
Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);//尺寸大小為8*8,每個像素點數據大小為CV_8UC1
// CV_8UC1 中的 8 代錶 8 比特的,UC代錶unsigned char,1錶示單通道的。
//通過屬性和方法來查看圖片的行數、列數和通道數。
std::cout << "width:" << m3.cols << "height:" << m3.rows << "channels:" << m3.channels() << std::endl;
std::cout << m3 << std::endl;
}
輸出結果如下:
當我把參數 CV_8UC1 中的 1 改為 3 ,會看到。
輸出結果如下:
因為3代錶的是3通道,每個通道是8比特,3通道就是24比特。
注意:行數(高度)不會變。
此外,我還可以將 zeros 改變為 ones
#include <iostream>
#include "03_opencv_mat.h"
using namespace std;
void QuickDemo::mat_creation_demo()
{
Mat m3 = Mat::ones(Size(8,8),CV_8UC1);//尺寸大小為8*8,每個像素點數據大小為CV_8UC1
std::cout << "width:" << m3.cols << "height:" << m3.rows << "channels:" << m3.channels() << std::endl;
std::cout << m3 << std::endl;
}
需要注意:ones 只能在單通道時使用,如果換成三通道的則不行(因為它只會把每個像素點的第一個通道置為 1)
void QuickDemo::mat_creation_demo()
{
Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);
m3 = 127;//當只輸入一個數值的時候,第一個通道的值全都變成127
std::cout << m3 << std::endl;
}
改為CV_8UC3再試試
這個時候,如果你要將三個通道全部賦值,應該怎麼做呢?
openCV提供了一個Scalar函數。
每個通道分量 可以修改。可以組合成各種各樣的顏色。
#include <iostream>
#include "03_opencv_mat.h"
using namespace std;
void QuickDemo::mat_creation_demo()
{
Mat m1 = Mat::zeros(Size(256, 256),CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m3 = Mat::zeros(Size(256, 256), CV_8UC3);
Mat m4 = Mat::zeros(Size(256, 256), CV_8UC3);
//當只輸入一個數值的時候,第一個通道的值全都變成127
//我事先知道有三個通道。
// B G R
// 0xFFFFFF
m1 = Scalar(127,127,127);//當三個通道的值相同時,就會顯示灰度圖像
// B G R
m2 = Scalar(255, 0, 0 );
m3 = Scalar( 0, 255, 0 );
m4 = Scalar( 0, 0, 255);
imshow("灰度圖像", m1);
imshow("純藍色圖像", m2);
imshow("純綠色圖像", m3);
imshow("純紅色圖像", m4);
}
注意:通道的對應關系
// B G R
// 0xFFFFFF。
不同灰度值對應的灰度圖像:
#include <iostream>
#include "03_opencv_mat.h"
using namespace std;
void QuickDemo::mat_creation_demo()
{
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC1);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC1);
Mat m3 = Mat::zeros(Size(256, 256), CV_8UC1);
Mat m4 = Mat::zeros(Size(256, 256), CV_8UC1);
m1 = Scalar(0);
m2 = Scalar(60);//可直接賦值,如m2 = 60
m3 = Scalar(128);
m4 = Scalar(256);
imshow("灰度 = 0 圖像", m1);
imshow("灰度 = 60 圖像", m2);
imshow("灰度 = 128 圖像", m3);
imshow("灰度 = 256 圖像", m4);
}
下面再來驗證下使用賦值方式
#include <iostream>
#include "03_opencv_mat.h"
using namespace std;
void QuickDemo::mat_creation_demo()
{
Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
m1 = Scalar(255, 0, 0);
imshow("m1原始圖像", m1);
Mat m2 = m1;
m2 = Scalar(255, 255, 0);
imshow("m1圖像", m1);
imshow("m2圖像", m2);
}
可見當 采用" m2 = m1 ",即賦值方式時,m2和m1指向存儲同一張圖片的地址(空間),修改m2就相當於是修改m1。
版權聲明
本文為[xuechanba]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201270625191452.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的