【问题标题】:Detect red rectangles (or squares) using OpenCV使用 OpenCV 检测红色矩形(或正方形)
【发布时间】:2018-12-23 05:18:34
【问题描述】:

我是 OpenCv 的新手,我需要检测图像中的红色矩形。

我找到了很多关于如何使用 OpenCV 检测红色圆圈的示例,例如 one。但是,

如何使用 OpenCV 和 C++ 检测红色矩形?

我想和上面的教程一样,识别这个圈子:

但是,我想识别矩形和正方形,而不是圆形。我想从最简单的部分开始,接下来我将更改照明条件。

【问题讨论】:

标签: c++ opencv


【解决方案1】:

由于您是新手,我建议您使用最简单的方法来检测形状对象,例如矩形。首先,您将对分割图像应用阈值处理(您可以使用Canny()),然后使用矩形的findContours() 提取轮廓,最后使用approxPolyDP() - 它将轮廓形状近似为具有较少顶点数的另一个形状,具体取决于我们指定的精度。它是Douglas-Peucker算法的一种实现。

cv::Mat src = ...;
cv::Mat gray = ...;
cv::Mat bw;
cv::Canny(gray, bw, 800, 850, 5, true); // Modify values for your use-case

std::vector<std::vector<cv::Point>> countours;
cv::findContours(bw.clone(), countours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

std::vector<cv::Point> approx;
cv::Mat dst = src.clone();

for(int i = 0; i < countours.size(); i++)
{
    cv::approxPolyDP(Mat(countours[i]), approx, arcLength(Mat(countours[i]), true) * 0.01, true);


    if (approx.size() == 4)
    {
        double maxCosine = 0;

        for (int j = 2; j < 5; j++)
        {
            double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
            maxCosine = MAX(maxCosine, cosine);
        }

        if (maxCosine < 1.2)
        {
            cv::line(dst, approx.at(0), approx.at(1), cvScalar(0,0,255), 4);
            cv::line(dst, approx.at(1), approx.at(2), cvScalar(0,0,255), 4);
            cv::line(dst, approx.at(2), approx.at(3), cvScalar(0,0,255), 4);
            cv::line(dst, approx.at(3), approx.at(0), cvScalar(0,0,255), 4);
        }

    }
}

【讨论】:

  • 这种方法不检测所有四边形(菱形、梯形、平行四边形等),而不仅仅是矩形?边界框r 是意外留在您的代码中还是您打算使用它?
  • 嗯,是的,你是对的,我忘了计算和比较角度。我会更新我的答案,谢谢指出。
  • 您还可以检查对角线的长度是否相等(在一定公差范围内)。
  • 您可以尝试执行 OpenCV 的“旋转矩形”,它返回 4 个点并计算旋转矩形的面积。然后使用 OpenCVs "contourArea" 返回轮廓的面积。如果两者相同或公差较小,则应为矩形
  • 我只想检测红色矩形。这种方法可以吗?代码在哪里做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 2017-11-15
相关资源
最近更新 更多