首页 > 解决方案 > xcode“OpenCV 4.x+ 需要启用 C++11 支持”

问题描述

问题

我目前正在开发一个使用 openCV for ios 的应用程序。现在的步骤是在 iphone 11 pro 上制作颜色直方图。swift不支持openCV,因此我包装了openCV框架以将其启用到ios。当我构建目标时,出现错误“OpenCV 4.x+ 需要启用 C++11 支持”。

发生错误的步骤是

1.xcode 不知何故无法识别 IplImage → 出现错误“预期类型”

2.添加<#opencv2/core/types_c.h>到文件openCVWrapper.h → 修复之前的错误

3.构建项目后,出现“OpenCV 4.x+ requires enabled C++11 support”错误

当前的错误

"OpenCV 4.x+ requires enabled C++11 support" //The error i am working on roght now
"'array'file not found" //It seems like this error will be fixed once the upper error has been fixed

代码

打开CVWrapper.h

#ifndef OpenCVWrapper_h
#define OpenCVWrapper_h
#endif /* OpenCVWrapper_h */
#import <UIKit/UIKit.h>
#import <opencv2/core/types_c.h>  //added to fix the "expected type" 

@interface OpenCVManager : NSObject
+(void) makeHistgramFromImage:(UIImage*)image;
+ (IplImage *)createIplImageFromUIImage:(UIImage *)uiImage;
@end

openCVWrapper.mm

#import <opencv2/opencv.hpp>
#import <opencv2/imgcodecs/ios.h>
#import <opencv2/imgproc/imgproc_c.h>
#import <opencv2/core/types_c.h>
#import "OpenCVWrapper.h"

@implementation OpenCVWrapper

+(void) makeHistgramFromImage:(UIImage *)image
{

 cv::Mat imageMat;
 UIImageToMat(image, imageMat);

 cv::Mat grayMat;
 cv::cvtColor (imageMat, grayMat, CV_BGR2GRAY);
 image = MatToUIImage(grayMat);

 IplImage *gray = [OpenCVManager createIplImageFromUIImage:image];

 float range[]={0,255};

 float* ranges[]={range};
 int histSize;
 histSize=256;
 CvHistogram* hist;

 hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1);

 cvCalcHist(&gray,hist,0,NULL);

 cvReleaseImage(&gray);
}
+ (IplImage *)createIplImageFromUIImage:(UIImage *)uiImage
{
 CGImageRef imageRef = uiImage.CGImage;
 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
 IplImage *iplimage = cvCreateImage(cvSize(uiImage.size.width, uiImage.size.height), IPL_DEPTH_8U, 4);

 CGContextRef contextRef = CGBitmapContextCreate(
 iplimage->imageData,
 iplimage->width,
 iplimage->height,
 iplimage->depth,
 iplimage->widthStep,
 colorSpace,
 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);

 CGContextDrawImage(contextRef, CGRectMake(0, 0, uiImage.size.width, uiImage.size.height), imageRef);
 CGContextRelease(contextRef);
 CGColorSpaceRelease(colorSpace);

 IplImage *outputImage = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
 cvCvtColor(iplimage, outputImage, CV_RGBA2BGR);

 cvReleaseImage(&iplimage);
 return outputImage;
}
@end

openCV-Bridging-Header.h

#import"OpenCVWrapper.h"

opencv2.framework/Headers/core/cvdef.h 第 691-705 行

#ifndef CV_CXX11
# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
#  define CV_CXX11 1
# endif
#else
# if CV_CXX11 == 0
#  undef CV_CXX11
# endif
#endif
#ifndef CV_CXX11
# error "OpenCV 4.x+ requires enabled C++11 support" //where the error is occuring
#endif

我做了什么

构建设置 → 基本 → 关卡

将 C++ 语言方言更改为 C++11

将 C++ 标准库更改为 libc++(支持 C++11 的 LLVM C++ 标准库)

现在我正在将 openCV4.x 实现到 xcode,但是根据类似的问题,它说我应该使用 openCV3.x(因为 C++11 只能从版本 4.x 开始使用)。因此,我曾经在我的项目中实现了 openCV3.x,但是在框架内部发生了另一个错误,这似乎是一个更难解决的问题,因此我决定使用 openCV4.x 并在 stackoverflow 中提出这个问题

虽然我知道我要做的就是为我的 xcode 启用 C++11,但首先我该怎么做以及如何解决这个错误?还是指向 IplImage 的前一个错误“预期类型”?

我在stackflow中搜索了许多网页,许多类似的问题,但从未找到适合自己的最佳解决方案,现在已经与此错误作斗争超过3天......请注意,如您所见,我愿意不太会用电脑,所以如果你有什么解决办法,如果你很认真地告诉我,我会很高兴的。

我正在使用的版本

xcode 11.4 openCV ver4.2.1

标签: c++iosxcodeopencvc++11

解决方案


推荐阅读