OpenCV:Scalar数据类型理解
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV:Scalar数据类型理解相关的知识,希望对你有一定的参考价值。
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;
}
以上是关于OpenCV:Scalar数据类型理解的主要内容,如果未能解决你的问题,请参考以下文章
C++ - 错误:为 OpenCV 的 cv::Scalar::all 创建 C 包装器时出现预期的类型说明符