8

每当我尝试在 iOS 中使用 OpenCV Stitcher 类并包含stitcher-header (#include) 时,我最终都会在expected_compensate.hpp 中出现编译错误“Expected '{'”。显然行 enum { NO, GAIN, GAIN_BLOCKS }; 导致某种错误。

我对 openCV 很陌生,但是使用 filter2d() 等其他功能可以按预期工作。我该如何解决这个问题?

4

6 回答 6

12

尝试

#import <opencv2/opencv.hpp>

然后

#import <UIKit/UIKit.h>

更新:这个答案只突出了问题的最低限度的解决方案,也许是根本原因:依赖关系的顺序。请参阅其他答案以获取您在项目中放置的更好的代码/设置。

于 2017-06-23T18:44:16.447 回答
8

在您的项目中,创建一个 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
于 2017-12-05T19:11:53.330 回答
3

我也遇到了这个问题。作为 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

这意味着您不会在此之前在应用程序的其他任何地方意外地包含一个苹果标题。

于 2017-04-23T16:04:41.490 回答
2

如标题开头所述,我通过在 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

希望有帮助。

于 2016-10-05T18:12:09.380 回答
1

我有一个类似的问题,我解决了直接编辑所涉及的 opencv-framework 文件(在你的情况下compensate.hpp)并从它们中评论NO枚举案例定义的定义。在这种情况下,文件是blender.hpp,但compensate.hpp具有相同的结构

希望这可以帮助

于 2019-07-19T10:26:07.853 回答
0

就我而言,我使用 openCV 创建了一个垂直图像拼接应用程序,错误如下图所示。它来自exposure_compensate.hppblenders.hpp。从错误描述来看,最上面的文件是 ../CVWrapper.mm,它在我的项目中,而不是 openCV pod 项目中。

正如上面的家伙所说,C ++和Apple MACRO之间存在一些冲突问题。我们应该将 C++ 标头放在 Apple 标头之上。

首先,我尝试了一种来自互联网的解决方法,上面写着“替换NONO_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"

在此处输入图像描述

于 2021-09-30T05:51:55.397 回答