【问题标题】:converting to&from OpenCV cv::Mat, NSImage转换为&从 OpenCV cv::Mat, NSImage
【发布时间】:2012-07-28 21:20:02
【问题描述】:

有一篇文章描述了如何做到这一点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 &lt;opencv2/core/core.hpp&gt;

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

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

所以我的问题是我做错了什么?如何让这段代码工作?

【问题讨论】:

    标签: xcode cocoa opencv


    【解决方案1】:

    另一个 stackoverflow 问答(链接:How to include OpenCV in Cocoa Application?)在未定义的符号上缺少部分。

    总结一下:

    1. 由于宏冲突,OpenCV 标头必须包含在 Cocoa 标头之前。
    2. Xcode 会自动在每个 Objective-C 文件(*.m、*.mm)的顶部包含 cocoa 头文件,这会阻止您首先添加 OpenCV 头文件,如第 1 点所述。
    3. Xcode 有一个“-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 解决这个问题。

    【讨论】:

    • 您的回答帮助我解决了我在 xcode 中遇到的大部分错误,但是在我按照您上面描述的操作之后,我仍然在 lsh_table.h 中遇到一个错误“语义问题:使用未声明的标识符”使用_speed_'”。你知道我该如何摆脱它吗?谢谢!
    【解决方案2】:

    那是 C++ 语法。您必须为源文件添加 .mm 后缀才能使其成为 Objective-C++。

    【讨论】:

    • 我已经这样做了。编译器可以识别语法,但不能识别未定义的符号“cv”和“Mat”。
    猜你喜欢
    • 2022-06-13
    • 2013-10-21
    • 2020-02-09
    • 2016-08-16
    • 2018-04-16
    • 2011-06-28
    • 2012-07-17
    • 2022-06-25
    • 2021-11-24
    相关资源
    最近更新 更多