2012-07-28 200 views
2

有一篇文章描述如何做到这一点here,似乎已经为其他人工作,但它不适合我编译。转换为&从OpenCV cv :: Mat,NSImage

这里的.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 ::垫是什么。 所以我把猜测的看着OpenCV的2.4教程,我需要添加

#include <opencv2/core/core.hpp>

这产生的其他20个错误,其中的编译器抱怨core.hpp文件。 其中的第一说:

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

所以我的问题是我在做什么错?我如何获得此代码的工作?

回答

9

另一个stackoverflow Q & A(链接:How to include OpenCV in Cocoa Application?)在未定义的符号上有缺失的部分。

总结:

  1. 的OpenCV头必须包括可可头之前,由于宏冲突。
  2. Xcode会自动在每个Objective-C文件(* .m,* .mm)的顶部包含可可标头,这会阻止您首先添加OpenCV标头,如第1点所述。
  3. Xcode has a “-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的评价是非常正确的。

+0

你的答案帮助我解决了我在xcode中遇到的大多数错误,但是在我做了上面描述的之后,我仍然在lsh_table.h中发现了一个错误:“语义问题:使用未声明的标识符'use_speed_'”。你知道我该如何摆脱它吗?谢谢! – 0pcl 2012-09-22 03:01:29

0

这是C++语法。你必须给你的源文件后缀.mm,使其成为Objective-C++。

+0

我已经这样做了。编译器识别语法,但不识别未定义的符号“cv”和“Mat”。 – wrjohns 2012-07-28 13:06:24