[高分无人机]:HSV 图片滤波 ——inRange Scalar

博客主要围绕inRange()函数展开,介绍了其参数,包括输入数组、上下边界数组或标量、输出数组等。还给出了两通道的使用例子,三通道以此类推。此外,对Scalar进行讲解,它可将各通道值构成整体赋给相同通道数的矩阵元素。

inRange()

//cpp
void cv::inRange	(	InputArray 	src,
InputArray 	lowerb,
InputArray 	upperb,
OutputArray 	dst 
)
//python		
dst	=cv.inRange(src, lowerb, upperb[, dst]	)
1. 参数

Parameters
src first input array.
lowerb inclusive lower boundary array or a scalar.
upperb inclusive upper boundary array or a scalar.
dst output array of the same size as src and CV_8U type.

2. 使用例子
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

两通道如下所示,三通道以此类推
dst(I)=lowerb(I)0≤src(I)0≤upperb(I)0∧lowerb(I)1≤src(I)1≤upperb(I)1 \texttt{dst} (I)= \texttt{lowerb} (I)_0 \leq \texttt{src} (I)_0 \leq \texttt{upperb} (I)_0 \land \texttt{lowerb} (I)_1 \leq \texttt{src} (I)_1 \leq \texttt{upperb} (I)_1 dst(I)=lowerb(I)0src(I)0upperb(I)0lowerb(I)1src(I)1upperb(I)1

3.Scalar讲解
Scalar_<_Tp>::Scalar_(_Tp v0, _Tp v1, _Tp v2, _Tp v3)
{
    this->val[0] = v0;
    this->val[1] = v1;
    this->val[2] = v2;
    this->val[3] = v3;
}

它将各个通道的值构成一个整体,赋给具有相同通道数的矩阵元素

<think>我们正在解决一个OpenCV图像处理问题:将图像从BGR转换到HSV颜色空间,然后通过设定HSV阈值提取特定颜色区域,最后查找轮廓。 步骤分解: 1. 读取图像 2. 将图像从BGR颜色空间转换到HSV颜色空间 3. 设定HSV阈值范围,使用inRange函数创建掩码 4. 可选:形态学操作(如开运算、闭运算)以去除噪声和填充空洞 5. 使用findContours函数查找轮廓 6. 绘制轮廓并显示结果 注意:HSV颜色空间中,H(色调)的范围是0-180(在OpenCV中,为了适应8位无符号整数,通常将0-360度范围压缩到0-180),S(饱和度)和V(亮度)的范围是0-255。 我们将以检测红色物体为例,因为红色在HSV空间中有两个范围(0-10和160-180)。 根据用户要求,我们将编写C++代码,并添加必要的注释。</think>### OpenCV C++实现:BGR转HSV颜色空间、颜色区域提取与轮廓检测 下面是一个完整的OpenCV C++实现方案,包含BGR到HSV转换、颜色区域提取和轮廓检测功能: ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { // 1. 读取图像 cv::Mat image = cv::imread("input.jpg"); if(image.empty()) { std::cerr << "Error: 图像加载失败" << std::endl; return -1; } // 2. BGR转HSV颜色空间 cv::Mat hsvImage; cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV); // 3. 定义颜色范围 (示例:红色) int hMin = 0, sMin = 100, vMin = 100; int hMax = 10, sMax = 255, vMax = 255; // 4. 创建颜色掩码 cv::Mat mask; cv::inRange(hsvImage, cv::Scalar(hMin, sMin, vMin), cv::Scalar(hMax, sMax, vMax), mask); // 5. 形态学处理(优化掩码质量) cv::Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(5, 5)); cv::morphologyEx(mask, mask, cv::MORPH_OPEN, kernel); // 去噪 cv::morphologyEx(mask, mask, cv::MORPH_CLOSE, kernel); // 填充空洞 // 6. 轮廓检测 std::vector<std::vector<cv::Point>> contours; std::vector<cv::Vec4i> hierarchy; cv::findContours(mask, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 7. 结果可视化 cv::Mat result = image.clone(); cv::drawContours(result, contours, -1, cv::Scalar(0, 255, 0), 2); // 绿色轮廓 // 8. 显示结果 cv::imshow("原始图像", image); cv::imshow("HSV掩码", mask); cv::imshow("检测结果", result); cv::waitKey(0); return 0; } ``` ### 关键步骤详解 #### 1. 颜色空间转换 使用`cv::cvtColor()`将图像从BGR转换到HSV空间: ```cpp cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV); ``` HSV模型将颜色信息分为: - **H (色调)**:$0^\circ - 360^\circ$(OpenCV中为$0-180$) - **S (饱和度)**:$0-255$ - **V (明度)**:$0-255$ #### 2. 颜色范围提取 使用`cv::inRange()`创建二值掩码: ```cpp cv::inRange(hsvImage, cv::Scalar(hMin, sMin, vMin), cv::Scalar(hMax, sMax, vMax), mask); ``` 常见颜色HSV范围参考: | 颜色 | H范围 | S范围 | V范围 | |------|-------|-------|-------| | 红色 | 0-10, 160-180 | >100 | >100 | | 绿色 | 35-85 | >100 | >50 | | 蓝色 | 90-130 | >100 | >100 | #### 3. 形态学优化 使用开闭运算优化掩码质量: ```cpp // 开运算:先腐蚀后膨胀,消除小噪点 cv::morphologyEx(mask, mask, cv::MORPH_OPEN, kernel); // 闭运算:先膨胀后腐蚀,填充小孔洞 cv::morphologyEx(mask, mask, cv::MORPH_CLOSE, kernel); ``` #### 4. 轮廓检测参数 `cv::findContours()`的关键参数: ```cpp cv::findContours( mask, // 输入二值图像 contours, // 输出轮廓点集 hierarchy, // 轮廓拓扑信息 cv::RETR_EXTERNAL, // 仅检测外部轮廓 cv::CHAIN_APPROX_SIMPLE // 压缩水平/垂直/对角线线段 ); ``` ### 高级功能扩展 #### 动态调整HSV范围(实时检测) ```cpp // 创建调整窗口 cv::namedWindow("HSV调整"); cv::createTrackbar("H Min", "HSV调整", &hMin, 179); cv::createTrackbar("H Max", "HSV调整", &hMax, 179); cv::createTrackbar("S Min", "HSV调整", &sMin, 255); // ...其他通道类似 while(true) { // 实时更新掩码 cv::inRange(hsvImage, cv::Scalar(hMin, sMin, vMin), cv::Scalar(hMax, sMax, vMax), mask); // 显示实时结果 cv::imshow("HSV调整", mask); if(cv::waitKey(30) == 27) break; // ESC退出 } ``` #### 轮廓几何特征计算 ```cpp for(size_t i = 0; i < contours.size(); i++) { // 计算轮廓面积 double area = cv::contourArea(contours[i]); // 计算轮廓周长 double perimeter = cv::arcLength(contours[i], true); // 计算最小外接矩形 cv::RotatedRect minRect = cv::minAreaRect(contours[i]); // 计算质心 cv::Moments m = cv::moments(contours[i]); cv::Point centroid(m.m10/m.m00, m.m01/m.m00); } ``` #### 复杂背景优化策略 1. **光照归一化**: ```cpp cv::Mat labImage; cv::cvtColor(image, labImage, cv::COLOR_BGR2Lab); std::vector<cv::Mat> labChannels; cv::split(labImage, labChannels); cv::equalizeHist(labChannels[0], labChannels[0]); // 对L通道均衡化 cv::merge(labChannels, labImage); ``` 2. **背景减除**: ```cpp auto bgSubtractor = cv::createBackgroundSubtractorMOG2(); cv::Mat fgMask; bgSubtractor->apply(image, fgMask); cv::bitwise_and(mask, fgMask, mask); // 结合颜色和运动信息 ``` 3. **多尺度处理**: ```cpp cv::Mat resized; cv::resize(image, resized, cv::Size(), 0.5, 0.5); // 缩小图像 // 在小尺度处理后再映射回原尺寸 ``` ### HSV颜色空间优势 HSV颜色空间相比RGB更适合颜色检测: - **色彩分离**:色调(H)独立于亮度和饱和度 - **光照鲁棒性**:对光照变化不敏感 - **直观控制**:参数调整更符合人类直觉 在工业检测、自动驾驶和机器人视觉等领域,HSV颜色空间结合轮廓检测是目标定位的常用方法[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值