看下面一段代码:
cv::Mat img1 = imread("./lena_bgr.png",1);
cv::Mat img2,img3;
cv::cvtColor(img1, img2, CV_RGB2BGR);
cv::cvtColor(img1, img3, CV_BGR2RGB);
cv::imshow("img1", img1);
cv::imshow("img2", img2);
cv::imshow("img3", img3);
cv::waitKey(0);
可以看出,img2
和img3
的图片是一模一样的。因为CV_RGB2BGR
与CV_BGR2RGB
的值都为4
,表示交换B
和R
通道的值。定义在/usr/local/include/opencv2/imgproc/types_c.h
中,可以看到以下枚举定义:
CV_BGR2RGB =4,
CV_RGB2BGR =CV_BGR2RGB,
底层算法确实是一样的,RGB
和BGR
互相转化也就是把R
和B
数据互换位置:
- 当你输入是
RGB
格式时,转化后就变成BGR
格式; - 当你输入是
BGR
格式时,转化后就变成RGB
格式; - 当你对一个图像使用
cv::cvtColor()
进行连续两次in-place
的CV_RGB2BGR
操作,就变回原来的颜色空间了。
上面的CV_RGB2BGR
和CV_BGR2RGB
是opencv2.x版本的;
opencv3.0版本的是 cv::COLOR_RGB2BGR
和cv::COLOR_BGR2RGB
。
他们定义在/usr/local/include/opencv2/imgproc.hpp
中的命名空间为cv
里面:
COLOR_BGR2RGB = 4,
COLOR_RGB2BGR = COLOR_BGR2RGB,
类似的还有:
enum{
CV_BGR2BGRA =0,
CV_RGB2RGBA =CV_BGR2BGRA,
CV_BGRA2BGR =1,
CV_RGBA2RGB =CV_BGRA2BGR,
CV_BGR2RGBA =2,
CV_RGB2BGRA =CV_BGR2RGBA,
CV_RGBA2BGR =3,
CV_BGRA2RGB =CV_RGBA2BGR,
CV_BGR2RGB =4,
CV_RGB2BGR =CV_BGR2RGB,
CV_BGRA2RGBA =5,
CV_RGBA2BGRA =CV_BGRA2RGBA,
CV_BGR2GRAY =6,
CV_RGB2GRAY =7,
CV_GRAY2BGR =8,
CV_GRAY2RGB =CV_GRAY2BGR,
CV_GRAY2BGRA =9,
CV_GRAY2RGBA =CV_GRAY2BGRA,
CV_BGRA2GRAY =10,
CV_RGBA2GRAY =11,
...
...
}