首先看一下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; }