Scalar
定义:
首先单词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:通道的建立与打印
运行以下代码输出如下,可以发现最后一个矩阵是4通道的,但是我们在初始化的时候只给出了三个通道的值,所以第四个通道的值都默认为0。
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.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; }
案例2:打印相同通道数矩阵图像
它将各个通道的值构成一个整体,赋给具有相同通道数的矩阵元素。
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.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; }