前言

今日基础示例开始之前,先聊两个问题:

  • 为什么 OpenCV 存储的图像格式是 BGR 呢 ?
  • CLion 上有没有类似于 Visual Studio Image Watch 的辅助工具 ?

第一个问题

大家都知道,通过 OpenCV imread 函数读取图片得到的数组是 BGR 格式的,而我们日常生活中使用最多的却是 RGB。不太合理,其实这里面隐藏着一个历史原因:
OpenCV在 1999 年由 Intel 建立,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为 BGR ,另外对于图片,位图 BMP 是最简单的,也是 Windows 显示图片的基本格式,其文件扩展名为 *.BMP。在 Windows 下,任何格式的图片文件(包括视频播放)都要转化为位图才能显示出来,各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的,值得注意的是位图 BMP 的格式就是 BGR 。正是基于 BGR 在当时被广泛使用,于是早期 OpenCV 开发者就选择 BGR 颜色格式,这也就成为了一种规范一直用到现在。
【引用自:https://mp.weixin.qq.com/s/Er3Poj8oxV5OKNlAlZwq_A】

第二个问题

Image Watch 是 VS 上一个强大的辅助工具,用过都说好。那么,针对使用 CLion 开发的小伙伴,有没有类似的辅助工具呢?

有,但是不全有。

OpenCV Image Viewer 是 CLion 上的一款 IDEA 插件,在调试模式下显示 numpy 数组 (Python) 或 cv::Mat (C++)。目前仅支持 GRAY、BGR 和 BGRA 图像。在 Python 中,图像必须是 HWC 格式。在 C++ 中,图像必须是连续数组。虽然功能并没有 Image Watch 那么强大,但是随着 CLion 和 Jetbrain 的发展,成就一个帮助开发者正常调试的插件应该是不成问题的。

opencv保存8位bmp opencv bmp_#include

opencv保存8位bmp opencv bmp_#include_02

色彩空间

闲聊结束,开始今天的基础示例。

关于色彩空间的转换规则:https://docs.opencv.org/master/de/d25/imgproc_color_conversions.html

  • RGB
  • HSV
  • YUV
  • LAB
  • GRAY

API

CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
  • 参数一:src,输入图像矩:8位无符号,16位无符号,单精度浮点数;
  • 参数二:dst,输出图像矩阵,大小和类型与输入相同;
  • 参数三:code,色彩空间转换代码;
  • 参数四:dstCn,目标图像中的通道数。若该值设置为0,通道数由 srccode 决定。

色彩空间转换代码比较多,自行查阅 API 文档即可。

The conventional ranges for R, G, and B channel values are:

  • 0 to 255 for CV_8U images
  • 0 to 65535 for CV_16U images
  • 0 to 1 for CV_32F images

示例

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;
using namespace std;

int main() {
    cout << CV_VERSION << endl;
    Mat src = cv::imread("../image/lena.tif", IMREAD_ANYCOLOR);
    if (src.empty()) {
        cout << "图片不存在" << endl;
        return -1;
    }
    namedWindow("input", WINDOW_AUTOSIZE);
    imshow("input", src);

    // BGR to HSV
    Mat hsv;
    cvtColor(src, hsv, COLOR_BGR2HSV);
    imshow("hsv", hsv);

    // BGR to YUV
    Mat yuv;
    cvtColor(src, yuv, COLOR_BGR2YUV);
    imshow("yuv", yuv);

    // BGR to Lab
    Mat lab;
    cvtColor(src, lab, COLOR_BGR2Lab);
    imshow("lab", lab);

    // BGR to GRAY
    Mat gray;
    cvtColor(src, lab, COLOR_BGR2GRAY);
    imshow("gray", lab);

    waitKey(0);
    return 0;
}

效果

opencv保存8位bmp opencv bmp_计算机视觉_03