2

有一篇文章描述了如何做到这 一点,这似乎对其他人有用,但它不适合我。

这是使用的 .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

我在 Xcode 4.4 上,使用 openCV 2.4.2。我为头文件得到的编译器错误是以下的 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 问答(链接:如何在 Cocoa 应用程序中包含 OpenCV?)在未定义的符号上有缺失的部分。

总结一下:

  1. 由于宏冲突,OpenCV 标头必须包含在 Cocoa 标头之前。
  2. Xcode 会自动在每个 Objective-C 文件(*.m、*.mm)的顶部包含可可头文件,这会阻止您首先添加 OpenCV 头文件,如第 1 点所述。
  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 回答