OpenCV更好地检测红色?
Posted
技术标签:
【中文标题】OpenCV更好地检测红色?【英文标题】:OpenCV better detection of red color? 【发布时间】:2015-12-07 23:40:52 【问题描述】:我有以下图片:
我想使用cv::inRange
方法和HSV 颜色空间来检测红色矩形。
int H_MIN = 0;
int H_MAX = 10;
int S_MIN = 70;
int S_MAX = 255;
int V_MIN = 50;
int V_MAX = 255;
cv::cvtColor( input, imageHSV, cv::COLOR_BGR2HSV );
cv::inRange( imageHSV, cv::Scalar( H_MIN, S_MIN, V_MIN ), cv::Scalar( H_MAX, S_MAX, V_MAX ), imgThreshold0 );
我已经创建了动态轨迹栏以更改 HSV 的值,但我无法获得所需的结果。
对使用最佳值(可能还有过滤器)有什么建议吗?
【问题讨论】:
【参考方案1】:在 HSV 空间中,红色环绕在 180 左右。因此,您需要 H
值同时位于 [0,10] 和 [170, 180] 中。
试试这个:
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
Mat3b bgr = imread("path_to_image");
Mat3b hsv;
cvtColor(bgr, hsv, COLOR_BGR2HSV);
Mat1b mask1, mask2;
inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2);
Mat1b mask = mask1 | mask2;
imshow("Mask", mask);
waitKey();
return 0;
你之前的结果:
结果添加范围[170, 180]:
另一种只需要检查单个范围的有趣方法是:
反转 BGR 图像 转换为 HSV 寻找青色颜色这个想法由fmw42 提出并由Mark Setchell 指出。非常感谢。
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
Mat3b bgr = imread("path_to_image");
Mat3b bgr_inv = ~bgr;
Mat3b hsv_inv;
cvtColor(bgr_inv, hsv_inv, COLOR_BGR2HSV);
Mat1b mask;
inRange(hsv_inv, Scalar(90 - 10, 70, 50), Scalar(90 + 10, 255, 255), mask); // Cyan is 90
imshow("Mask", mask);
waitKey();
return 0;
【讨论】:
只是我想分享的来自@fmw42 的一个很酷的小技巧...您可以反转图像并寻找不换行的青色:-) ***.com/a/43926013/2836621 @MarkSetchell 太聪明了!为完整起见,使用 C++ 代码添加到答案中。非常感谢! 您的回复非常有帮助!谢谢@Miki! 你能帮帮我吗?我的 imshow("Mask", mask) 给出了一个错误。error: (-215) size.width>0 && size.height>0 in function imshow
。据我了解,错误是因为 mask.data == null 。我究竟做错了什么?提前致谢以上是关于OpenCV更好地检测红色?的主要内容,如果未能解决你的问题,请参考以下文章