转换为& from OpenCV cv :: Mat,NSImage

时间:2012-07-28 03:52:44

标签: xcode cocoa opencv

有一篇文章描述了如何执行此操作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

所以我的问题是我做错了什么?如何使此代码生效?

2 个答案:

答案 0 :(得分:9)

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

总结:

  1. 由于宏冲突,必须在Cocoa标头之前包含OpenCV标头。
  2. Xcode会自动在每个Objective-C文件(* .m,*。mm)的顶部包含cocoa标头,这会阻止您首先添加OpenCV标头,如第1点所述。
  3. Xcode有一个“-Prefix.pch”文件,它定义了自动添加到任何代码之前的任何代码。
  4. 通常看起来像:

    #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 ++。