1

私はコンピュータービジョン分野の新人です。

私が使用しようとしている EmguCV (OpenCV の .NET ラッパー) でいくつかのコード例を見つけました。

現在、三角形の交通標識認識に取り組んでおり、cvMatchShapes 関数を使用しています。

この関数は、理想的なケースでは「ゼロ」を返します。これは、形状が同じで、数が

形状が類似している場合はゼロに近い。

問題は、私の場合、関数が論理外の結果を返すことです。関数が三角形と円を比較すると、2 つの三角形を比較して得られた Figure より小さい Figure が返されます。

ここに私が使用する機能と画像があります:

                double ratio = CvInvoke.cvMatchShapes(modelSignTraffic, trafficSign, Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);

modelSignTraffic - テンプレートです。私の場合は -

ここに画像の説明を入力

trafficSign - テンプレートと比較する必要がある形状です。

最初に比較した形状

ここに画像の説明を入力

2 番目に比較した形状 -

ここに画像の説明を入力

最初の形状では比率 0.55 を取得し、2 番目の形状では比率 0.61 を取得します。

なぜこのような非論理的な結果が得られるのか、どうすれば修正できるのかを誰かが説明できれば、とても感謝しています。

前もって感謝します。

4

2 に答える 2

2

なぜこの結果が論理的ではないと思うのか理解できません。の式を読みましたCV_CONTOURS_MATCH_I3か? ここにあります。この係数を手で計算すると、同じ結果が得られると 100% 確信しています。

ちなみに、画像ではなく輪郭(形状)のこの係数を計算する必要があります。したがって、最初に形状を検出し、この後に使用しますMatchShapes

アップデート:

あなたの解決策は間違っています。最初に赤い色をセグメント化し、この使用後にfindContours赤い形状を検出する必要があります。

于 2012-08-25T17:42:44.340 に答える
0

Resize拡張機能を使用して画像を同じサイズに拡大縮小した後、cvMatchShapes関数からより良い結果を得ることができました。

残念ながら、このアプローチで他のオプションをチェックすると、必ずしも望ましい結果が得られるとは限らないため、このソリューションは理想的ではありません。

コードは次のとおりです。

     Image<Bgr, Byte> triangleModel = new Image<Bgr, Byte>("TriangleTamplate.jpg")
                        .Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
     Image<Gray, Byte> grayModel = triangleModel.Convert<Gray, Byte>();
     Image<Gray, Byte> cannyModel = grayModel .Canny(new Gray(100), new Gray(160));


     Image<Bgr, Byte> comparedImage = new Image<Bgr,Byte>("ImageToCompare.jpg")
                         .Resize(200, 200, Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR,true);
     Image<Gray, Byte> grayImage = tempImage.Convert<Gray, Byte>();
     Image<Gray, Byte> cannyImage = grayImage.Canny(new Gray(100),new Gray(160));

     double eRatio = CvInvoke.cvMatchShapes(cannyModel.Ptr, cannyImage,Emgu.CV.CvEnum.CONTOURS_MATCH_TYPE.CV_CONTOURS_MATCH_I3, 0);

三角形の比率は0.0320です

円の比率は0.0829です

于 2012-09-06T22:47:42.397 に答える