3

OpenCVライブラリのJavaCVラッパーを調べたところ、Javaでそのライブラリを使用して画像の顔を検出できることがわかりましたが、そのライブラリを使用して画像のトラフィック警告サインを検出できるのではないかと思いました。どうやって?

http://www.4shared.com/photo/5QxoVDwd/041.htmlのように道路から撮影した写真が あり、検出結果は次のようになります:http://www.4shared。 com / photo / z_pL0lSK / overlay-0.html

編集: 私が赤い色を検出した後、私はこの画像を取得します:

ここに画像の説明を入力してください

また、警告サインの三角形の形状だけを検出し、他のすべての形状を無視するのに問題があります。cvUsingPolyパラメーターを変更しようとしましたが、結果がありませんでした。これは私のコードです:

public void myFindContour(IplImage image)
{
    IplImage grayImage = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
    cvCvtColor(image, grayImage, CV_BGR2GRAY);

    CvMemStorage mem;
    CvSeq contours = new CvSeq();
    CvSeq ptr = new CvSeq();
    cvThreshold(grayImage, grayImage, 150, 255, CV_THRESH_BINARY);
    mem = cvCreateMemStorage(0);

    cvFindContours(grayImage, mem, contours, Loader.sizeof(CvContour.class) , CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
    Random rand = new Random();

    while (contours != null && !contours.isNull()) {
        if (contours.elem_size() > 0) {
            CvSeq points = cvApproxPoly(contours, Loader.sizeof(CvContour.class),
                    mem, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);
            Color randomColor = new Color(rand.nextFloat(), rand.nextFloat(), rand.nextFloat());
            CvScalar color = CV_RGB( randomColor.getRed(), randomColor.getGreen(), randomColor.getBlue());
            cvDrawContours(image, points, color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
        }
        contours = contours.h_next();
    }

    cvSaveImage("myfindcontour.png", image);

}

これは私が得る出力です(私はすべての形に異なる色を使用しましたが、最終的な出力では、検出された警告サインに白のみを使用し、他のすべては黒のままにします):

ここに画像の説明を入力してください

4

3 に答える 3

2

次のことを行う必要があります。

  1. 画像の赤い色を検出します。1ビットの画像が表示さます。0 =赤以外、1 =赤です。
  2. 前のステップの画像で作成された三角形を検出します。関数を使用してそれを行うことができますapproxPoly
于 2012-08-03T13:47:43.167 に答える
0

を参照してください。最初に輪郭領域を見つけます。事前に計算された値と比較し、次のような範囲で維持します

if(area>Mincontourarea && area<maxcontourare)
{
thats it  now we have the signboard do  
}

計算された場合の値は、車のコノトゥールよりも大きくはありません。コントローラーを私の知識に合わせるには、モーメント演算子が必要です。

momntsオペレーターのコード:

Moments moment = moments((cv::Mat)contours[index]);
       area = moment.m00;  //m00 gives the area of the detected contour

上記のifブロックの前に上記のコードを置きます

x座標とy座標が必要な場合は、もう一度投稿してください。

于 2013-05-28T15:24:28.323 に答える
0

私の答えを見てください。これはC++ですが、opencvを使用すると道路標識を検出できるので、良い例として取り上げることができます。 https://stackoverflow.com/a/52651521/8035924

于 2018-10-04T16:33:50.377 に答える