转换为OpenCV cv :: Mat,NSImage

wrj*_*hns 2 xcode cocoa opencv

有一篇文章描述了如何在这里做到这 一点,这似乎对其他人有用,但它不能为我编译.

这是使用的.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
Run Code Online (Sandbox Code Playgroud)

我使用openCV 2.4.2在Xcode 4.4上.我为头文件获得的编译器错误是以下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

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

wrj*_*hns 9

另一个stackoverflow Q&A(链接:如何在Cocoa应用程序中包含OpenCV?)在未定义的符号上有缺失的部分.

总结一下:

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

通常,它看起来像:

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif
Run Code Online (Sandbox Code Playgroud)

相反,应该将文件更改为:

#ifdef __cplusplus
#import <opencv2/opencv.hpp>
#endif

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
#endif
Run Code Online (Sandbox Code Playgroud)

因此,在任何*.cpp文件的情况下,opencv标头会自动添加.在任何*.m文件的情况下,添加Cocoa头.在*.mm文件的特殊情况下,它们会以正确的顺序添加.

感谢Ian Charnas和user671435搞清楚这一点.