【问题标题】:How do I detect polygon contours that I drew by using opencv?如何检测使用 opencv 绘制的多边形轮廓?
【发布时间】:2014-05-21 14:17:22
【问题描述】:

我是 OpenCV 的新手。我知道有很多方法可以检测多边形的轮廓。但是,如何检测使用 opencv 绘制的多边形轮廓?

这是我的代码:

Mat src = imread("C:/Users/Nickolay/Desktop/1.jpg");
resize(src, src, Size(400, 400), 0, 0, INTER_CUBIC);
if (src.empty()) 
{
    cout << "Cannot load image!" << endl;
    return -1;
}

//================================

Mat gray;
cvtColor(src, gray, CV_BGR2GRAY);
Mat bw;
Canny(gray, bw, 800, 850, 5, true);
imshow("canny", bw);
vector<vector<Point>> countours;
findContours(bw.clone(), countours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);

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

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

    if (approx.size() >= 4 && (approx.size() <= 6))
    {
        int vtc = approx.size();
        vector<double> cos;
        for(int j = 2; j < vtc + 1; j++)
            cos.push_back(Angle(approx[j%vtc], approx[j-2], approx[j-1]));

        sort(cos.begin(), cos.end());

        double mincos = cos.front();
        double maxcos = cos.back();

        if (vtc == 4)// && mincos >= -0.5 && maxcos <= 0.5)
        {
            Rect r = boundingRect(countours[i]);
            double ratio = abs(1 - (double)r.width / r.height);

            line(dst, approx.at(0), approx.at(1), cvScalar(0,0,255),4);
            line(dst, approx.at(1), approx.at(2), cvScalar(0,0,255),4);
            line(dst, approx.at(2), approx.at(3), cvScalar(0,0,255),4);
            line(dst, approx.at(3), approx.at(0), cvScalar(0,0,255),4);
            SetLabel(dst, "RECT", countours[i]);
        }
    }
}

//================================

imshow("source", src);
imshow("detected lines", dst);

waitKey(0);

return 0;`

从图片中可以看出,检测到了 3 个矩形。但是,我想检测所有 5 个矩形。我如何做到这一点?

【问题讨论】:

  • 我不明白你的问题是什么。而且通常不是你的英语,而是你如何看待你的问题。看看你的问题,想想如果你是一个回答问题的人,你会如何解决这个问题。
  • 我的问题是如何检测我使用opencv绘制的多边形轮廓?
  • 在附加图片中,我使用了来自 opencv 的函数,但我只得到了 3 个预期的 5 个矩形。
  • 代码中的“Angle”和“SetLable”是什么?它们显示为无法识别

标签: c++ opencv canny-operator


【解决方案1】:

问题可能是您直接传递边缘图像以查找轮廓,其中可能包含许多未连接的边缘。

所以在找到轮廓之前应用Morphology Transformations

喜欢,

   Size kernalSize (5,5);
   Mat element = getStructuringElement (MORPH_RECT, kernalSize, Point(1,1)  );
   morphologyEx( bw, bw, MORPH_CLOSE, element );

查看结果。

轮廓的边界矩形

轮廓的approxPolyDP

【讨论】:

    【解决方案2】:

    您可能还想尝试使用阈值来查找边缘,而不是 Canny。

    threshold (gray, bw, 0, 255, THRESH_BINARY|THRESH_OTSU);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2021-10-29
      • 2013-06-16
      • 2019-11-24
      相关资源
      最近更新 更多