有一篇文章描述了如何执行此操作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
我在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
所以我的问题是我做错了什么?如何使此代码生效?
答案 0 :(得分:9)
另一个stackoverflow Q&amp; A(链接:How to include OpenCV in Cocoa Application?)在未定义的符号上有缺失的部分。
总结:
通常看起来像:
#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搞清楚这一点。
答案 1 :(得分:0)
这就是C ++语法。您必须为源文件提供.mm
后缀,以使其成为Objective-C ++。