11

openCV 2.4.3 / Xcode 4.5.2 / mac osx 10.8.2

openCVをiOSで動作させようとしています。openCV.orgからビルド済みの2.4.3フレームワークを使用しようとしています。ただし、次のxcodeプロジェクトビルドエラーが発生します。これは、コンパイラがc++を処理していることを認識していないことを示しています。

#include <list>       !'list' file not found

namespace cv          !unknown type name 'namespace'

これは、次のヘッダーファイルにのみ関係しているようです:
"opencv2 / nonfree / features2d.hpp"
"opencv2 / nonfree / nonfree.hpp"
"opencv2 / video / video.hpp"

これらの3つのファイルをopencv.hpp(または他の場所)にインクルードしなければ、openCVokをコンパイルして使用できるようです。問題は、最近非フリーに移行されたSURFを試しているので、非フリーファイルが必要なことです。

これは本当に2つの質問です(申し訳ありません;-)

  • これらがC++ヘッダーであることをコンパイラに納得させるにはどうすればよいですか?
  • SURFを使用するために正確に必要なヘッダーはどれですか?

アップデート

openCV gitリポジトリのクローンを作成し、そこから新しいフレームワークを構築しました。このアプローチは以前は機能していませんでしたが、今日、私は現在のバージョンのCMAKEを使用していないことに気付きました。私はCMAKE2.8.2を使用していましたが、これではios用のopencvをビルドできませんでした。現在のバージョンのCMAKE2.8.10は、問題なくビルドできます(これは、CMAKE min。v2.8.8が必要であるというドキュメントに従うためのオブジェクトレッスンです)。

Xcodeプロジェクトにopencvフレームワークのこの現在のビルドを追加すると、features2dnonfreeを含めて、スムーズにビルドできます。唯一の問題は、1つのヘッダーvideo/background_segm.hppに残ります。

#include <list>       !'list' file not found

その行をコメントアウトすると、次の行でエラーが発生します。

namespace cv          !unknown type name 'namespace'

接尾辞が付いていても、コンパイラがこれをC++ヘッダーとして認識しないことは明らかです.hpp

削除opencv2/video/video.hpp すると

#include "opencv2/video/background_segm.hpp"

私も一緒に構築することvideo.hppができます(実際には使用できないと思いますが)。

残念ながら、私はまだSURFを動作させることができません。プロジェクトを実行すると、次のエラーでクラッシュします。

OpenCVエラー:機能/機能が実装されていません(OpenCVはSURFサポートなしで構築されました)

これはでトリガーされlegacy/features2d.cppます:

   Ptr<Feature2D> surf = Algorithm::create<Feature2D>("Feature2D.SURF");
   if( surf.empty() )
        CV_Error(CV_StsNotImplemented, "OpenCV was built without SURF support");

質問は残っています...

  • background_segm.hpp正当なc++ヘッダーである コンパイラを説得するにはどうすればよいですか?
  • SURFサポートを有効にするにはどうすればよいですか?
4

2 に答える 2

11

私は今すべてが機能しています。openCV.orgから入手できるビルド済みのiOSライブラリに満足しなかった後、これが私がしたことです...

  • gitHubリポジトリのクローンからiOS用のopenCVをコンパイルします。選択した出力ディレクトリをポイントして、(ディストリビューションbuild_framework.pyのフォルダで)実行します。CMakeの最新のコピーを持っていることを確認してください。そうしないと、私のようにつまずきます。ios

  • 出力フォルダーは、2つのサブフォルダーとで終わりbuildますopencv2.framework。後者をXcodeプロジェクトにドラッグします

project-Prefix.pchファイルに次の行を追加します

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

(境界線より上に移動する必要があり#ifdef __OBJC__ます)

これは、openCVのほとんどを機能させるのに十分です。ただし、「objective-C ++」(Objective-Cと同じファイルにC ++コードを混在させる)は避けることをお勧めします。これを管理するには、obj-Cクラスとc ++コードの間を仲介する薄い「ラッパー」オブジェクト(obj-C ++になります)を作成します。ラッパーには、基本的に2つの役割しかありません。データ形式(UIImage <-> cv :: Matなど)を変換することと、obj-CメソッドとC++関数呼び出しの間を変換することです。詳細(およびgithubがホストするサンプルプロジェクト)については、この質問に対する私の回答を参照してください。

SURF(およびSIFT)を機能させるには、ライセンスの問題によりSURFが非推奨になってnonfreeいるため、いくつかの追加手順が必要です(SURFは自動的にロードされない場所に移動されました)。

これらのインクルードは、SURFを使用しているファイルに追加する必要があります

#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/compat.hpp>

私が使用しているコードはSURFのCインターフェース(例cvExtractSURF)を使用しているため、これらの関数を呼び出す前に次の行も追加する必要があります。

   cv::initModule_nonfree();

私の質問の他の部分、XcodeをC ++としてコンパイルする方法は、少し赤いニシンでした(私が使用していたopenCVビルドとの互換性の問題があったに違いありません)-そしてこのソリューションにはもう必要ありません。ただし、答えは最初に、.mファイルの名前を.mm(objective-C ++の場合)または.cpp(純粋なC ++の場合)に変更することです…しかし、それが機能しない場合は、'fileを変更することでファイルインスペクターで問題を強制できます。タイプ'。

アップデート

また、openCVフレームワークを使用するプロジェクトでは、C++標準ライブラリが正しく設定されていることに注意する必要があります。古いバージョンのopenCV(to.2.4.2)は必要libstdc++であり、新しいバージョン(2.4.3+)は期待していlibc++ます。詳細はこちら:

https://stackoverflow.com/a/14186883/1375695

アップデート2

openCVはcocoaPodsとともにインストールされるようになりました。SebastienThiebaudを引用するには

OpenCVはCocoapodsで利用できます。Podfileに1行追加します:pod'OpenCV'。とても簡単。

「かなり簡単」...これまでのすべての煩わしさを考えると、[昨年]の控えめな表現かもしれません...

于 2013-01-04T05:53:34.387 に答える
1

openCV実装クラスは、実装ファイルとして.mを.mmに追加するだけです。

#import <UIKit/UIKit.h>
#import <opencv2/opencv.hpp>

@interface ViewController : UIViewController

@end

ここに画像の説明を入力してください .mmファイルはiOSのC++コンパイラで実行されるため、エラーは表示されません。

于 2014-01-03T10:59:31.437 に答える