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 包装器时出现预期的类型说明符

OpenCV阶段总结扩充。

OpenCV的Scalar对象怎样取分量值?

OpenCV其他常用数据类型

OpenCV的标量容器Scalar尽量别去做运算,用来存储标量数据即可

学习opencv