OpenCV學習筆記(3)——Scalar資料型別理解

Lavi_qq_2910138025發表於2020-04-05

定義:

首先單詞scalar的意思是標量,但是我們經常可以看到Scalar是包含多個值的,很像是一個向量,這是怎麼回事呢?很是讓人感覺困惑。先收起我們的困惑,首先來看看,Scalar的定義:

 

typedef struct Scalar
{
    double val[4];
}Scalar;

可以看到,Scalar是一個由長度為4的陣列作為元素構成的結構體,Scalar最多可以儲存四個值,沒有提供的值預設是0。

 

使用:

Scalar常用的使用場景如下:

 

Mat M(7,7,CV_32FC2,Scalar(1,3));


上面的程式碼表示:建立一個2通道,且每個通道的值都為(1,3),深度為32,7行7列的影像矩陣。CV_32F表示每個元素的值的型別為32位浮點數,C2表示通道數為2,Scalar(1,3)表示對矩陣每個元素都賦值為(1,3),第一個通道中的值都是1,第二個通道中的值都是3.

 

例項1:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;
void scalar_demo1(){
	Mat M(4,4,CV_32FC2,Scalar(1,3));
	cout<<M<<endl;
}
void scalar_demo2(){
	Mat M(4,4,CV_32FC3,Scalar(1,2,3));
	cout<<M<<endl;
}
void scalar_demo3(){
	Mat M(4,4,CV_32FC4,Scalar(1,2,3));
	cout<<M<<endl;
}
int main(void)
{
	//resize_img();
	//convert_color_space();
	scalar_demo1();
	cout<<"**********************************"<<endl;
	scalar_demo2();
	cout<<"**********************************"<<endl;
	scalar_demo3();
	return 0;
}

 

 

執行以上程式碼輸出如下,可以發現最後一個矩陣是4通道的,但是我們在初始化的時候只給出了三個通道的值,所以第四個通道的值都預設為0。

 

例項2:

 

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <stdio.h>
using namespace std;
using namespace cv;

void scalar_demo4(){
	Mat blue_m(256,256,CV_8UC3,Scalar(255,0,0));
	Mat green_m(256,256,CV_8UC3,Scalar(0,255,0));
	Mat red_m(256,256,CV_8UC3,Scalar(0,0,255));
	imshow("Blue",blue_m);
	waitKey(0);
	imshow("Green",green_m);
	waitKey(0);
	imshow("Red",red_m);
	waitKey(0);
	
}
int main(void)
{
	scalar_demo4();
	return 0;
}

執行結果如下:

 

相信讀到這你已經明白Scalar是用來幹什麼的了,它將各個通道的值構成一個整體,賦給具有相同通道數的矩陣元素。至於它開頭提到的它為什麼叫做標量,就不必再糾結了。

相關文章