當前位置:網站首頁>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

隨機推薦