首页 > 编程笔记 > C++笔记 阅读:2

OpenCV Scalar类的用法(附带实例)

Scalar 是一个由长度为 4 的数组作为元素构成的类,Scalar 最多可以存储 4 个值,一般用来存放像素值。它由模板类 Scalar_ 定义而得,如下代码:
/* 模板类 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 函数中:
3) 保存工程并运行,结果如下图所示:

相关文章