2

三角形検出のためにハフ変換を実装する方法の例を探しています。必要な兆候検出用です。私はすでに色のしきい値処理を行っています。の使用についてどう思いますHoughLinesP()か? 私はキャニーをやっていて、次にしきい値を設定してHoughLinesを使用していますが、結果は多くの行になり、サインの中にもあります。今交差点を見つけることが私の解決策になるとは思いません。

どう思いますか?例や他のアイデアはありますか?私も試しましfindContours()たが、三角形は丸みを帯びているため、大きな近似値が必要であり、検出がゴミでいっぱいになります。

4

3 に答える 3

0

HoughLinesP私の意見では、これは不安定で、入力画像とパラメータの前処理に大きく依存するため、このタスクに使用するのは非常に難しいでしょう。少し前に私は同様のタスクを解決し、次の処理パイプラインをお勧めします(入力画像がグレースケールであると仮定します):

  1. cv::blur画像処理用
  2. cv::MSERリージョンを検索します (ここでパラメーターを調整する必要があります)。小さな領域を拒否したい場合があります。
  3. 各地域について:

    3.1. cv::convexHull領域の凸包を見つけます。

    3.2. 3 つ以下のポリラインが返されるまで、パラメーターcv::approxPolyDPを増やして凸包を行います。epsilon行数が 3 未満のリージョンは拒否できます。

    3.3. 最後に、線間の角度を計算し、それが三角形であることを確認できます。すべての角度が 60 度に近い (または 90 度未満) 場合、この領域を三角形としてマークします。

それが役立つことを願っています。このタスクをうまく解決できる場合は、ここで経験を説明してください。

于 2015-05-16T23:12:22.803 に答える
0

問題は、行数が極端に多いか 1 であることです。これは私のコードです:

#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);
}
于 2015-05-17T02:40:26.573 に答える