この質問に対する私の答えで解決策を試してください...
OpenCV で iOS リンク エラーを解決する方法
また、githubには、最近構築されたopenCVフレームワークを使用した、いくつかの簡単な作業サンプルがあります。
注意 - OpenCVSquares は OpenCVSquaresSL よりも単純です。後者は、Snow Leopard の下位互換性のために適合されました。これには、openCV フレームワークの 2 つのビルドと 3 つのターゲットが含まれているため、システムで実行する場合は、より単純な OpenCVSquares を使用することをお勧めします。
円を検出するように OpenCVSquares を適応させるには、openCV ディストリビューションのHough Circles c++ サンプルから始めて、それを使用して適応/置換することCVSquares.cpp
をお勧めします。CVSquares.h
CVCircles.cpp
CVCicles.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() パラメータを調整するスライダー付き