使用霍夫变换的C ++ OpenCV三角检测

时间:2015-05-16 18:31:14

标签: c++ opencv detection hough-transform triangular

我正在寻找一些如何实现三角形检测的霍夫变换的例子。它需要进行符号检测。我已经完成了颜色阈值处理。您对使用HoughLinesP()有何看法?我正在做Canny,然后进行阈值处理并使用HoughLines,但结果是很多行,而且我的符号也在里面。我现在不认为找到交叉点是我的解决方案。

你怎么看?任何例子或其他想法?我也尝试了findContours(),但是三角形是圆形的,所以它们需要很大的近似值,这样就可以检测出垃圾。

3 个答案:

答案 0 :(得分:0)

在我看来,将HoughLinesP用于此任务将非常困难,因为它不稳定并且很大程度上取决于输入图像和参数的预处理。前段时间我解决了类似的任务,我在处理管道后假设您(假设输入图像是灰度):

  1. cv::blur用于图片增强
  2. cv::MSER查找区域(需要在此处调整参数)。您可能想要拒绝小区域。
  3. 对于每个地区:

    3.1。 cv::convexHull找到区域的凸包。

    3.2。对cv::approxPolyDP参数增加的凸包进行epsilon,直到它返回3条或更少的折线。您可以拒绝行数小于3的区域。

    3.3。最后,您可以计算线之间的角度并检查它是否为三角形。如果所有角度接近60度(或仅低于90度),则将该区域标记为三角形。

  4. 我希望它会有所帮助。如果您将成功解决此任务,请在此处描述您的体验。

答案 1 :(得分:0)

问题是,行号极高或一行。这是我的代码:

#define red 10, 180, 180, 25, 255, 255

    void SetScalars(int h1, int s1, int v1, int h2, int s2, int v2){
        color_min = Scalar(h1, s1, v1);
        color_max = Scalar(h2, s2, v2);
    }

    void triangles(){
    ToHSV();
    SetScalars(red);
    Thresh();
    Mat dst = frame.clone();
    vector<vector<Point>> contours;
    blur(frame_thresh, frame_thresh, Size(3, 3));
    MSER(15,250,1000,0.15)(frame_thresh, contours);
    // Find the convex hull object for each contour
    vector<vector<Point> >hull(contours.size());
    for (int i = 0; i < contours.size(); i++)
    {
        int vtc = hull[i].size(); 
        convexHull(Mat(contours[i]), hull[i], false);
        approxPolyDP(Mat(contours[i]), hull[i], arcLength(Mat(contours[i]), true) * 0.1, true);
        cout << vtc << endl;
        if (vtc == 3){
            vector<double> cos;
            cos.push_back(angle(hull[i][0], hull[i][1], hull[i][2]));
            cos.push_back(angle(hull[i][1], hull[i][2], hull[i][0]));
            cos.push_back(angle(hull[i][0], hull[i][2], hull[i][1]));
            sort(cos.begin(), cos.end());
            double mincos = cos.front();
            double maxcos = cos.back();
            if (vtc == 3 && mincos > 0.4 && maxcos < 0.6){
                Rect r = boundingRect(contours[i]);
                Mat croppedImage = dst(r);
                imshow("detected triangle", croppedImage);
            }
        }
    }
    Mat drawing = Mat::zeros(frame_thresh.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        drawContours(drawing, contours, i, Scalar(0,0,255));
        drawContours(drawing, hull, i, Scalar(255, 0, 255));
        int vtc = hull[i].size();
    }
    imshow("mser", drawing);
}

答案 2 :(得分:0)

您正在寻找的是Generalized Hough Transform,它是Hough变换的一般化,用于检测任意形状。这样,您可以将形状指定为三角形。

OpenCV中有一个广义Hough的实现: http://docs.opencv.org/master/d7/dd4/classcv_1_1GeneralizedHough.html 并且您可以使用setTemplate方法来定义形状。