每当我尝试在 iOS 中使用 OpenCV Stitcher 类并包含stitcher-header (#include) 时,我最终都会在expected_compensate.hpp 中出现编译错误“Expected '{'”。显然行 enum { NO, GAIN, GAIN_BLOCKS }; 导致某种错误。
我对 openCV 很陌生,但是使用 filter2d() 等其他功能可以按预期工作。我该如何解决这个问题?
每当我尝试在 iOS 中使用 OpenCV Stitcher 类并包含stitcher-header (#include) 时,我最终都会在expected_compensate.hpp 中出现编译错误“Expected '{'”。显然行 enum { NO, GAIN, GAIN_BLOCKS }; 导致某种错误。
我对 openCV 很陌生,但是使用 filter2d() 等其他功能可以按预期工作。我该如何解决这个问题?
尝试
#import <opencv2/opencv.hpp>
然后
#import <UIKit/UIKit.h>
更新:这个答案只突出了问题的最低限度的解决方案,也许是根本原因:依赖关系的顺序。请参阅其他答案以获取您在项目中放置的更好的代码/设置。
在您的项目中,创建一个 Prefix Header MyProject.pch,并将其设置在您项目的构建设置中。
然后在该 pch 文件中,执行以下操作:
#ifdef __cplusplus
# include <opencv2/opencv.hpp>
# include <opencv2/stitching/detail/blenders.hpp>
# include <opencv2/stitching/detail/exposure_compensate.hpp>
#else
# import <Foundation/Foundation.h>
# import <UIKit/UIKit.h>
# import <Availability.h>
#endif
我也遇到了这个问题。作为 G. Führ 确保您首先包含 opencv 标头。最简单的方法是添加:
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif
靠近应用程序“Appname-Prefix.pch”标题的顶部。这是一个预编译的头文件,可以很容易地保证您的 opencv 头文件将包含在任何苹果头文件之前。
//
// Prefix header
//
// The contents of this file are implicitly included at the beginning of every source file.
//
#import <Availability.h>
#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif
#ifdef __cplusplus
#include <opencv2/opencv.hpp>
#endif
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif
这意味着您不会在此之前在应用程序的其他任何地方意外地包含一个苹果标题。
如标题开头所述,我通过在 OpenCV 之前导入任何 Apple 标题来解决此问题:
#if defined(NO)
# warning Detected Apple 'NO' macro definition, it can cause build conflicts. Please, include this header before any Apple headers.
#endif
希望有帮助。
就我而言,我使用 openCV 创建了一个垂直图像拼接应用程序,错误如下图所示。它来自exposure_compensate.hpp
和blenders.hpp
。从错误描述来看,最上面的文件是 ../CVWrapper.mm,它在我的项目中,而不是 openCV pod 项目中。
正如上面的家伙所说,C ++和Apple MACRO之间存在一些冲突问题。我们应该将 C++ 标头放在 Apple 标头之上。
首先,我尝试了一种来自互联网的解决方法,上面写着“替换NO
为NO_EXPOSURE_COMPENSATOR = 0
”。这行得通,但它修改了 openCV 源代码,我不想这样做,因为我不会对 Pod 文件进行版本控制,然后如果其他人克隆我的 repo/项目,他们将需要对这些源进行相同的修改代码。
然后,我按照 Xcode 中的错误消息,在我的CVWrapper.mm
文件中做了以下更改。之后,这两个错误消失了。
// Before change
#import "CVWrapper.h"
#import "UIImage+OpenCV.h"
#import "stitching.h"
#import "UIImage+Rotate.h"
// After change
#import "stitching.h"
#import "CVWrapper.h"
#import "UIImage+OpenCV.h"
#import "UIImage+Rotate.h"