最近接到一个任务,将halcon代码改写成opencv代码。
在改写时,遇到一个RGB颜色空间转换到HSV颜色空间的问题。转换语句很简单:
cvtColor(src, dst, COLOR_BGR2HSV)
转换后需要对Hue通道的值进行门限值判断,halcon代码中Hue门限值区间是[300,350]。因为8bit图的上限是255,已经超出了360度,所以我就去opencv官网文档查了一下这个函数。
其中Hue值,我一开始理解的是Hue值取一半,然后归一化到[0,255]区间内(fit to 0 to 255)。在调试这段程序的时候,始终没有发现大于300的像素,统计一下最大值也才只有170多。
遂决定写几条语句验证一下转换公式:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
Mat blue(1, 1, CV_8UC3, Scalar(255, 0, 0));
Mat green(1, 1, CV_8UC3, Scalar(0, 255, 0));
Mat red(1, 1, CV_8UC3, Scalar(0, 0, 255));
Mat hsvOfBlue, hsvOfGreen, hsvOfRed;
cvtColor(blue, hsvOfBlue, COLOR_BGR2HSV);
cvtColor(green, hsvOfGreen, COLOR_BGR2HSV);
cvtColor(red, hsvOfRed, COLOR_BGR2HSV);
cout << "After convertion, hue of blue is \n" << hsvOfBlue << endl;
cout << "After convertion, hue of green is \n" << hsvOfGreen << endl;
cout << "After convertion, hue of red is \n" << hsvOfRed << endl;
waitKey(0);
return 0;
}
运行结果如下:
从运行结果可以看出,转换后Hue的值只是取了理论值(蓝色240°,绿色120°,红色0°)的二分之一,并没有归一化到[0,255]。我又回去读那句话:to fit to 0 to 255。这时候才明白,原来取理论值的二分之一的目的是为了适配[0,255]的区间。所以在改写halcon代码中判断Hue门限值的时候,门限值同样也要乘以二分之一。同时也可以发现saturation和value已经被归一化到[0,255]范围内了。