2012-07-28 164 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