2

これを行う方法を説明した記事があります here、他の人にはうまくいったようですが、私にはコンパイルできません。

使用した .h ファイルのコピーを次に示します。

//
//  NSImage+OpenCV.h
//

#import <AppKit/AppKit.h>

@interface NSImage (NSImage_OpenCV) {

}

+(NSImage*)imageWithCVMat:(const cv::Mat&)cvMat;
-(id)initWithCVMat:(const cv::Mat&)cvMat;

@property(nonatomic, readonly) cv::Mat CVMat;
@property(nonatomic, readonly) cv::Mat CVGrayscaleMat;

@end

openCV 2.4.2を使用して、Xcode 4.4を使用しています。ヘッダー ファイルで発生するコンパイラ エラーは、次の 4 倍です。

Semantic issue: Use of undeclared identifier 'cv'

このエラーは明らかです...ヘッダーファイルは cv::Mat が何であるかを定義していません。OpenCV 2.4チュートリアルを見て、追加する必要があると推測しました

#include <opencv2/core/core.hpp>

これにより、他の 20 個のエラーが生成され、コンパイラは core.hpp ファイルについて不平を言っていました。その最初の言葉は次のとおりです。

Semantic issue: Non-const static data member must be initialized out of line

だから私の質問は、私が間違っていることは何ですか? このコードを機能させるにはどうすればよいですか?

4

2 に答える 2

9

別の stackoverflow Q&A (リンク: How to include OpenCV in Cocoa Application? ) には、未定義のシンボルに欠けている部分がありました。

要約する:

  1. マクロの競合のため、OpenCV ヘッダーは Cocoa ヘッダーの前に含める必要があります。
  2. Xcode は、すべての Objective-C ファイル (*.m、*.mm) の先頭に cocoa ヘッダーを自動的に含めます。これにより、ポイント 1 で述べたように、最初に OpenCV ヘッダーを追加することができなくなります。
  3. Xcode には、任意のコードの先頭に自動的に追加される任意のコードを定義する「-Prefix.pch」ファイルがあります。

通常、次のようになります。

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif

代わりに、ファイルを次のように変更する必要があります。

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

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif

したがって、*.cpp ファイルの場合、opencv ヘッダーが自動的に追加されます。*.m ファイルの場合、Cocoa ヘッダーが追加されます。*.mm ファイルの特殊なケースでは、両方が正しい順序で追加されます。

これを理解した Ian Charnas と user671435 に感謝します。

于 2012-07-28T13:20:02.880 に答える
0

それがC++構文です。ソースファイルに.mm接尾辞を付けて、Objective-C++にする必要があります。

于 2012-07-28T06:16:33.127 に答える