# C++ OpenCV怎么使用InRange对HSV颜色进行分割 ## 一、HSV颜色空间简介 HSV(Hue-Saturation-Value)是一种更符合人类视觉感知的颜色模型,与RGB相比更适合颜色分割任务: - **H(色相)**:表示颜色类型,范围0-180(OpenCV中压缩为0-180) - **S(饱和度)**:颜色纯度,范围0-255 - **V(明度)**:颜色亮度,范围0-255 ```cpp // RGB转HSV示例 Mat bgrImage, hsvImage; cvtColor(bgrImage, hsvImage, COLOR_BGR2HSV);
inRange()
是OpenCV中进行颜色分割的核心函数:
void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst);
#include <opencv2/opencv.hpp> using namespace cv;
int main() { // 读取图像 Mat image = imread("test.jpg"); if(image.empty()) return -1; // 转换到HSV空间 Mat hsvImage; cvtColor(image, hsvImage, COLOR_BGR2HSV); // 设置颜色范围(示例:提取红色) Scalar lower_red(0, 70, 50); Scalar upper_red(10, 255, 255); // 颜色分割 Mat mask; inRange(hsvImage, lower_red, upper_red, mask); // 显示结果 imshow("Original", image); imshow("Mask", mask); waitKey(0); return 0; }
对于跨越HSV色相0值(如红色)的颜色:
// 处理红色(需要两个区间) Mat mask1, mask2; inRange(hsvImage, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1); inRange(hsvImage, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2); Mat mask = mask1 | mask2;
建议创建轨迹条实时调试:
// 创建调节窗口 namedWindow("Trackbars"); createTrackbar("Hue Min", "Trackbars", &h_min, 179); // ...其他通道类似 // 在循环中实时更新 while(true) { Scalar lower(h_min, s_min, v_min); Scalar upper(h_max, s_max, v_max); inRange(hsvImage, lower, upper, mask); imshow("Mask", mask); if(waitKey(1) == 27) break; }
颜色 | H范围 | S范围 | V范围 |
---|---|---|---|
红色 | 0-10, 160-180 | 100-255 | 50-255 |
绿色 | 35-85 | 50-255 | 50-255 |
蓝色 | 90-120 | 70-255 | 50-255 |
黄色 | 20-35 | 100-255 | 100-255 |
// 去除噪声 Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5)); morphologyEx(mask, mask, MORPH_OPEN, kernel); // 填充空洞 morphologyEx(mask, mask, MORPH_CLOSE, kernel);
vector<vector<Point>> contours; findContours(mask, contours, RETR_EXTERNAL, CHN_APPROX_SIMPLE); for(size_t i=0; i<contours.size(); i++) { if(contourArea(contours[i]) > 500) { // 过滤小区域 drawContours(image, contours, i, Scalar(0,255,0), 2); } }
// 识别红色禁止标志 Scalar lower_red(0, 100, 100); Scalar upper_red(10, 255, 255); inRange(hsvImage, lower_red, upper_red, mask);
// 皮肤颜色范围 Scalar lower_skin(0, 48, 80); Scalar upper_skin(20, 255, 255); inRange(hsvImage, lower_skin, upper_skin, mask);
通过合理设置HSV范围和结合后处理,inRange可以高效实现复杂场景下的颜色分割任务。建议在实际项目中配合其他视觉算法共同使用。 “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。