1

私は OpenCV を使用して、iPhone カメラから撮影した画像でコインを検出できるようにしています。私はそれらを見つけるのを助けるために HoughCircles メソッドを使用していますが、結果は期待できません。

cv::Mat greyMat;
    cv::Mat filteredMat;
    cv::vector<cv::Vec3f> circles;
    cv::cvtColor(mainImageCV, greyMat, CV_BGR2GRAY);

    cv::threshold(greyMat, filteredMat, 100, 255, CV_THRESH_BINARY);

    for ( int i = 1; i < 31; i = i + 2 )
    {
//        cv::blur( filteredMat, greyMat, cv::Size( i, i ), cv::Point(-1,-1) );
        cv::GaussianBlur(filteredMat, greyMat, cv::Size(i,i), 0);
//        cv::medianBlur(filteredMat, greyMat, i);
//        cv::bilateralFilter(filteredMat, greyMat, i, i*2, i/2);
    }

    cv::HoughCircles(greyMat, circles, CV_HOUGH_GRADIENT, 1, 50);

    NSLog(@"Circles: %ld", circles.size());

    for(size_t i = 0; i < circles.size(); i++)
    {
        cv::Point center((cvRound(circles[i][0]), cvRound(circles[i][1])));
        int radius = cvRound(circles[i][2]);
        cv::circle(greyMat, center, 3, cv::Scalar(0,255,0));
        cv::circle(greyMat, center, radius, cv::Scalar(0,0,255));
    }

    [self removeOverViews];
    [self.imageView setImage: [self UIImageFromCVMat:greyMat]];

このコードの現在のセグメントは、15 個の円があり、それらがすべて画像の右側に沿って配置されていることを示しているため、混乱しています。

とのイメージ

OpenCVは初めてで、iOSの例はほとんどなく、必死になりました。

どんな助けでも大歓迎です、事前に感謝します!

4

3 に答える 3

2

あなたのアルゴリズムはあまり意味がありません。cv::GaussianBlur を繰り返し使用しているようですが、HoughCircles を実行すると、31x31 カーネルの GassianBlur によってフィルタリングされた灰色の画像でのみ機能し、がらくたをぼかします画像。最良の結果を得るには、次のようなことを行う方が理にかなっています。

これにより、すべての画像が繰り返し表示されます。これは、最初にやりたかったことだと思います。

// NOTE only psuedocode, won't compile, need to fix up.
for ( int i = 1; i < 31; i = i + 2 )
{
    cv::GaussianBlur(filteredMat, greyMat, cv::Size(i,i), 0);
    cv::HoughCircles(greyMat, circles, CV_HOUGH_GRADIENT, 1, 50);

    for(size_t i = 0; i < circles.size(); i++)
    {
        cv::Point center((cvRound(circles[i][0]), cvRound(circles[i][1])));
        int radius = cvRound(circles[i][2]);
        cv::circle(greyMat, center, 3, cv::Scalar(0,255,0));
        cv::circle(greyMat, center, radius, cv::Scalar(0,0,255));
    }
    cv::imshow("Circles i " + i, greyMat);
}

HoughCircle の実装が機能するには、いくつかのエッジが必要です。Canny エッジ検出器を使用し、画像がそれほどぼやけている場合。

また、ぼかしますが、いくつかのエッジを保持しようとする bilateralFilter を使用することをお勧めします。

これは、正しいパラメーターを定義するのにも役立ちます: HoughCircles ボールを認識するためのパラメーター

于 2013-05-25T21:35:58.230 に答える
0

上記のコードはすべて同じプロセスを繰り返し実行するだけなので、円は描画された円を何度も検出します。最高ではありません。私の意見では、ガウスぼかしも何度も使用していますが、最良の方法ではありません。画像を読みやすくするために for ループで Gaussian Blur を確認できますが、for ループで HoughCircles を確認することはできません。すべての変数を houghcircles に含める必要があります。それらをすべて使用すると、認識率が 2 倍になりました。

cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 30, 50, 20, 10, 25);

opencv Web サイトで利用できるのと同じ形式で、C++ 形式です。

これが私のiPhone sim picへのリンクです。デスクトップ上のコストコ アスピリン。アプリは画像内の円をカウントし、ラベルに合計を表示します。

ここに画像の説明を入力

これが私のコードです。私が試したことを示すために多くのコメントが含まれています...そしてふるいにかけました。お役に立てれば。 xcode での OpenCV のインストール

于 2013-11-28T16:57:41.307 に答える