色彩空间转换。
cv::Vec3b bgr2hsv(const cv::Vec3f& bgr, int hrange = 255, bool full = true) {
float b = bgr[0];
float g = bgr[1];
float r = bgr[2];
float maxVal = std::max({ r, g, b });
float minVal = std::min({ r, g, b });
float hue = 0.0f;
if (maxVal != minVal) {
if (maxVal == b)
hue = 60 * (r - g) / (maxVal - minVal) + 240.0f;
else if (maxVal == g)
hue = 60 * (b - r) / (maxVal - minVal) + 120.0f;
else if (maxVal == r)
hue = 60 * (g - b) / (maxVal - minVal);
if (hue < 0.0f)
hue += 360.0f;
}
float saturation = maxVal == 0.0f ? 0.0f : (maxVal - minVal) / maxVal;
float value = maxVal;
if (full)
hue = hue * hrange / 360.0f;
else
hue /= 2.0f;
hue *= hrange / 360.0f;
saturation *= hrange;
value *= hrange;
hue = saturate_cast<uchar>(hue);
saturation = saturate_cast<uchar>(saturation);
value = saturate_cast<uchar>(value);
return cv::Vec3b(hue, saturation, value);
}
···
···