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) 保存工程并运行,结果如下图所示:

ICP备案:
公安联网备案: