2

私は何時間もopenCVでxcodeプロジェクトを実行しようとしてきました。ソースをビルドしてプロジェクトにインポートし、.pchファイルに#ifdef __cplusplus #import opencv2 /opencv.hpp>#endifをインクルードしました。

http://docs.opencv.org/trunk/doc/tutorials/introduction/ios_install/ios_install.htmlの指示に従いました

それでも、コンパイル時に多くのAppleMach-Oリンカーエラーが発生します。

Undefined symbols for architecture i386:
 "std::__1::__vector_base_common<true>::__throw_length_error() const", referenced from:

私が本当に迷っているのを手伝ってください。

アップデート:

エラーはすべて修正され、現在、円を検出しようとしています。

Mat src, src_gray;

cvtColor( image, src_gray, CV_BGR2GRAY );

vector<Vec3f> circles;

/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, image.rows/8, 200, 100, 0, 0 );


/// Draw the circles detected
for( size_t i = 0; i < circles.size(); i++ )
{
    Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
    int radius = cvRound(circles[i][2]);
    // circle center
    circle( src, center, 3, Scalar(0,255,0), -1, 8, 0 );
    // circle outline
    circle( src, center, radius, Scalar(0,0,255), 3, 8, 0 );


}

上記のコードを使用していますが、画像に円が描かれていません。間違っていることが明らかなことはありますか?

4

1 に答える 1

8

この質問に対する私の答えで解決策を試してください...

OpenCV で iOS リンク エラーを解決する方法

また、githubには、最近構築されたopenCVフレームワークを使用した、いくつか簡単な作業サンプルがあります。

注意 - OpenCVSquares は OpenCVSquaresSL よりも単純です。後者は、Snow Leopard の下位互換性のために適合されました。これには、openCV フレームワークの 2 つのビルドと 3 つのターゲットが含まれているため、システムで実行する場合は、より単純な OpenCVSquares を使用することをお勧めします。

円を検出するように OpenCVSquares を適応させるには、openCV ディストリビューションのHough Circles c++ サンプルから始めて、それを使用して適応/置換することCVSquares.cppをお勧めします。CVSquares.hCVCircles.cppCVCicles.h

原則はまったく同じです。

  • c++ から UI コードを削除し、UI は obj-C 側で提供されます。
  • main() 関数を、ヘッダー ファイルで宣言されたクラスの静的メンバー関数に変換します。これは、Objective-C メッセージの形式でラッパーにミラーリングする必要があります (obj-c メソッドを c++ 関数呼び出しに変換します)。

Objective-C 側からは、UIImage をラッパー オブジェクトに渡します。

  • UIImage を cv::Mat 画像に変換します
  • Mat を処理のために C++ クラスに渡す
  • Mat からの結果を UIImage に変換します
  • 処理された UIImage を Objective-C 呼び出しオブジェクトに返します

アップデート

適応された houghcircles.cpp は、最も基本的な部分で次のようになります (CVSquares クラスを CVCircles クラスに置き換えました)。

cv::Mat CVCircles::detectedCirclesInImage (cv::Mat img)
{   
    //expects a grayscale image on input
    //returns a colour image on ouput
    Mat cimg;
    medianBlur(img, img, 5);
    cvtColor(img, cimg, CV_GRAY2RGB);
    vector<Vec3f> circles;
    HoughCircles(img, circles, CV_HOUGH_GRADIENT, 1, 10,
                 100, 30, 1, 60 // change the last two parameters
                 // (min_radius & max_radius) to detect larger circles
                 );
    for( size_t i = 0; i < circles.size(); i++ )
        {
        Vec3i c = circles[i];
        circle( cimg, Point(c[0], c[1]), c[2], Scalar(255,0,0), 3, CV_AA);
        circle( cimg, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, CV_AA);
        }
    return cimg;
    }

簡単にするために、入力パラメータは 1 つ (入力画像) に削減されていることに注意してください。まもなく、iOS UI のスライダー コントロールに関連付けられたいくつかのパラメーターを含むサンプルを github に投稿しますが、最初にこのバージョンを動作させる必要があります。

関数のシグネチャが変更されたため、チェーンをたどる必要があります...

houghcircles.h クラス定義を変更します。

    static cv::Mat detectedCirclesInImage (const cv::Mat image);

を呼び出す同様の構造のメソッドを受け入れるように CVWrapper クラスを変更します。detectedCirclesInImage

    + (UIImage*) detectedCirclesInImage:(UIImage*) image
    {
        UIImage* result = nil;
        cv::Mat matImage = [image CVGrayscaleMat];
        matImage = CVCircles::detectedCirclesInImage (matImage);
        result = [UIImage imageWithCVMat:matImage];
        return result;
    }

houghcircles 関数は入力時にグレースケール イメージを想定しているため、入力 UIImage をグレースケールに変換していることに注意してください。github プロジェクトの最新バージョンをプルするように注意してください。CVGrayscaleMat カテゴリにエラーが見つかりましたが、現在は修正されています。出力画像はカラーです (見つかった円を選択するためにグレースケールの入力画像に適用される色)。

入力画像と出力画像をカラーで表示したい場合は、Houghcircles() に送信するために入力画像をグレースケール変換する必要がありますcvtColor(input_image, gray_image, CV_RGB2GRAY)。見つかった円をカラー入力画像に適用します (これが戻り画像になります)。

最後に、CVViewController で、メッセージを CVWrapper に変更して、この新しい署名に準拠させます。

    UIImage* image = [CVWrapper detectedCirclesInImage:self.image];

これらすべての詳細に従えば、プロジェクトは円検出結果を生成します。


2 つの OpenCVCircles を Github で更新
HoughCircles() パラメータを調整するスライダー付き

于 2013-01-19T16:32:41.130 に答える