OpenCV Scalar类的用法(附带实例)
Scalar 是一个由长度为 4 的数组作为元素构成的类,Scalar 最多可以存储 4 个值,一般用来存放像素值。它由模板类 Scalar_ 定义而得,如下代码:
【实例】为矩阵类 Mat 赋通道像素值。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
在 scalar_demo2 函数中:
3) 保存工程并运行,结果如下图所示:
/* 模板类 Scalar_ :最多可存储 4 个同类型数值,常用于表示颜色或向量 */ template<typename _Tp> class Scalar_ : public Vec<_Tp, 4> { public: /* 无参构造:默认初始化为 0 */ Scalar_(); /* 带参构造:显式给出 1~4 个值 如果只给 v0,其余补 0;最多可给 v0~v3 共 4 个值 */ Scalar_(_Tp v0, _Tp v1, _Tp v2 = 0, _Tp v3 = 0); /* 单值构造:用同一个值填充 4 个通道 */ Scalar_(_Tp v0); /* 从任意 Vec<_Tp2, cn> 构造 Scalar_ */ template<typename _Tp2, int cn> Scalar_(const Vec<_Tp2, cn>& v); /* 其余成员略 … */ }; /* 常用别名:Scalar 等价于 Scalar_<double> */ typedef Scalar_<double> Scalar;类 Scalar 在初始化矩阵时经常用到,用来对每个通道赋值。例如,存放单通道图像中的像素:cv::Scalar(255);存放三通道图像中的像素:cv::Scalar(255,255,255)。
【实例】为矩阵类 Mat 赋通道像素值。
1) 新建一个控制台工程,工程名是 test。
2) 打开 main.cpp,输入如下代码:
#include <iostream> #include <opencv2/highgui/highgui.hpp> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace cv; using namespace std; /* ---------- demo1:用 Scalar 生成纯色图像 ---------- */ void scalar_demo1() { /* 创建 256×256 的三通道图像,分别填充蓝、绿、红 */ 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(1000); imshow("Green", green_m); waitKey(1000); imshow("Red", red_m); waitKey(1000); } /* ---------- demo2:用 Scalar 初始化 Mat 并打印 ---------- */ int scalar_demo2() { /* 单通道 2×3 矩阵,全部元素设为 125 */ cv::Scalar scalar(125); cv::Mat mat(2, 3, CV_8UC1, scalar); std::cout << mat << std::endl << std::endl; /* 双通道 4×4 矩阵,每像素 (0, 255) */ cv::Scalar scalar1(0, 255); cv::Mat mat1(4, 4, CV_32FC2, scalar1); std::cout << mat1 << std::endl << std::endl; /* 三通道 4×4 矩阵,每像素 (0, 255, 255) */ cv::Scalar scalar2(0, 255, 255); cv::Mat mat2(4, 4, CV_32FC3, scalar2); std::cout << mat2 << std::endl << std::endl; /* 四通道 4×4 矩阵,每像素 (0, 255, 255, 0) */ cv::Scalar scalar3(0, 255, 255, 0); cv::Mat mat3(4, 4, CV_32FC4, scalar3); std::cout << mat3 << std::endl; return 0; } /* ---------- 主函数 ---------- */ int main() { scalar_demo1(); scalar_demo2(); return 0; }在 scalar_demo1 函数中,imshow 可以显示 Mat 内容。值得注意的是,OpenCV 中对 RGB 图像数据的存储顺序是 BGR,所以 Scalar(255, 0, 0) 显示的是蓝色,Scalar(0, 255, 0) 显示的是绿色,Scalar(0, 0, 255) 显示的是红色。请记住 Scalar 的 3 个参数的顺序是 B、G、R。
在 scalar_demo2 函数中:
- scalar(125) 表示对矩阵每个元素都赋值为 125,因此 cv::Mat mat(2,3,CV_8UC1,scalar) 表示创建单通道,且每个通道的值都为 125,深度为 8,是 2 行 3 列的图像矩阵;
- scalar1(0,255) 表示第一个通道中的值都是 0,第二个通道中的值都是 255,因此 cv::Mat mat1(4,4,CV_32FC2, scalar1) 表示创建双通道,且每个通道的值都为 (0,255),深度为 32,是 4 行 4 列的图像矩阵;
- scalar2(0,255,255) 表示第一个通道中的值都是 0,第二个通道中的值都是 255,第三个通道中的值都是 255,因此 cv::Mat mat2(4,4,CV_32FC3,scalar2) 表示创建三通道,且每个通道的值都为 (0,255,255),深度为 32,是 4 行 4 列的图像矩阵;
- scalar3(0,255,255,0) 表示第一个通道中的值都是 0,第二个通道中的值都是 255,第三个通道中的值都是 255,第四个通道中的值都是 0,因此,cv::Mat mat3(4,4,CV_32FC4,scalar3) 表示创建四通道,且每个通道的值都为 (0,255,255,0),深度为 32,是 4 行 4 列的图像矩阵。
3) 保存工程并运行,结果如下图所示:
