2

色と形状で交通標識を検出しようとしています。色のセグメンテーションからのバイナリ イメージがあり、その中の三角形を検出しようとしています。三角形のすべての辺が完全でない限り、機能しません。

たとえば、この画像では、三角形は検出されません

ここに画像の説明を入力

私が使用しているコードはこれです:

vector<Point> approx;
   findContours(copia,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
   vector<Rect_ <int> > boundRect( contours.size() );
   vector<Rect_ <int> > boundRect_( contours.size() );
   for(size_t i=0; i<contours.size();i++)
   {

       approxPolyDP(Mat(contours[i]), approx,arcLength(Mat(contours[i]), true)*0.02, true);

       if (approx.size() == 3 &&fabs(contourArea(Mat(approx))) > 300 && isContourConvex(Mat(approx)))
           drawContours(capture->image,contours,i,Scalar(0,255,0));

cotourArea の問題ではありません。完全な三角形の検出に問題はありません。そのような「完全ではない三角形」を検出するために何かできるかどうか、またはそれらを検出できるように三角形を完成させるために何かをしなければならないかどうかはわかりません。いずれにせよ、私は少し迷っています

ご協力ありがとうございました

編集:画像をアップロードするのを忘れていました

4

2 に答える 2

1

実際、三角形のopencv側は視覚的に難しいかもしれませんが、達成するのに役立つ方法を提案します。

1) コーナー検出器を使用する

( OpenCV Canny ) バイナリ画像の隅々まで検出します。ぼかしや非最大抑制の代わりに、ノイズを減らす手段として形態学的操作 ( Dilate と Errode ) を使用すると思います。次に、端点を使用して接続し、三角形を形成します。おそらく多くのコーナーがあるため、すべてのポイントをフィッティングしてみて、最大のフィットを選択できます。delaunay 三角形分割を使用して、点の三角形を見つけることもできます。

2) 曲率情報を使用します。 三角形の 1 つのエッジが欠落しているため、2 つのエッジを使用して外接輪郭の曲率を計算できます。ここでもモルフォロジー演算 ( Dilate と Errode ) が役立ちます。曲率 (バイナリ イメージの輪郭の曲率の計算) が頂点のように極端に変化する点を選択し、線を当てはめて三角形の近似値を得ることができます。画像のノイズが少ない場合は、凸包を使用て近似値を取得できます。

3) RANSAC フィッティング フィッティング法を使用して、三角形の変形を使用して三角形を近似し、それをバイナリ イメージの 2 つの推定エッジに適合させることもできます。

于 2015-04-06T16:02:45.020 に答える