【问题标题】:iOS: OpenCV Red color rangeiOS:OpenCV 红色范围
【发布时间】:2015-07-15 07:06:33
【问题描述】:

我正在尝试使用 OpenCV 库在图片中圈出红色。我在谷歌看到了很多问题,但没有人帮助我。我的代码如下:

void highLightRed(const cv::Mat& inputFrame, cv::Mat& outputFrame)
{
cv::Mat gray, edges, red, blurred;

// blur will enhance edge detection
medianBlur(inputFrame, blurred, 9);

// give image in gray color space
getGray(blurred, gray);

cv::inRange(gray, cv::Scalar(0,0,112), cv::Scalar(60,0,225), red); //BGR

// using Canny algorithm to find edges
cv::Canny(red, edges, 50, 150);

std::vector< std::vector<cv::Point> > c;

// find contours of edges
cv::findContours(edges, c, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);

NSLog(@"size: %lu", c.size());

inputFrame.copyTo(outputFrame);

// draw contour in green (0,200,0) with thinkness 3
//cv::drawContours(outputFrame, c, -1, cv::Scalar(0,200,0),3);
cv::drawContours(outputFrame, c, -1, cv::Scalar(0,200,0),2);

}

void getGray(const cv::Mat& input, cv::Mat& gray)
{
const int numChannes = input.channels();

if (numChannes == 4)
{
    cv::cvtColor(input, gray, cv::COLOR_BGRA2GRAY);
}
}

问题:如果图片中只有红色和白色,则此代码可以正常工作,它可以成功包围红色。但是,如果涉及多种颜色,特别是深色,则颜色检测将失败。 我需要只检测红色的精确范围。谢谢

【问题讨论】:

  • 正如@skm 所说,您最好切换到 HSV 色彩空间。您不需要拆分和合并频道,但可以使用cv::inRange。有关示例,请参见 here
  • 我已经玩了很多 cv::inRange 但我没有成功找到合适的范围。切换到 HSV 色彩空间是一个更好的主意。
  • 如果您发现@skm 的回答不错,请考虑点赞或标记为答案。如果您没有设法解决您的问题,请告诉我们出了什么问题。如果您自己解决了,请发布答案并接受它。

标签: ios opencv bgr


【解决方案1】:

找到 BGR 或 RGB 格式的准确颜色范围非常困难。您将不得不经常玩它(如果您是新手)。

一个很简单的方法:

  1. 使用cvtColor()将图像转换为HSV格式
  2. 将您的HSV image 分成三个通道,即 H、S 和 V 通道。
  3. H-channel 中提取红色。您可以查看here 找到红色的色调范围。
  4. 将这个新的H-channel 与旧的SV 频道合并。
  5. 转换回 BGR 格式。现在您的 BGR 图像将只包含红色。

【讨论】:

  • 感谢您的回复。你让我朝着正确的方向前进。实际上我需要带有红色边界的原始图像,所以第 4 步和第 5 步对我的情况没有帮助。目前我设法通过从上述代码返回的列表中删除所有不是红色的轮廓点来修复。
  • 如果回答对您有帮助,请点赞或接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2021-08-19
  • 2011-12-09
  • 2012-08-04
  • 2019-01-12
  • 2011-02-04
相关资源
最近更新 更多