opencv学习笔记——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; }