c++ - 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
解决方案
推荐阅读
- json - 使用数据工厂将嵌套对象从 SQL Server 复制到 Azure CosmosDB
- c# - Transaction.commit 在实体框架中抛出争论空异常
- c# - 如何使用 C# ZipFile 处理空的 zip 文件
- c++ - @class AVPlayerLayer 的预期不合格 ID
- c# - 如何设置 JsReport .NET 以使用当前的应用程序文件夹
- python - 附加到具有相同键、多个值的字典
- certificate - 有没有办法使用过期证书签署二进制文件?
- ilias - 在 ilUIHookPluginGUI 中获取高级元数据的更简单方法?
- postgresql - PostgreSQL 卡在恢复模式(strace 返回 semop)
- swift - 如何在 macOS 中访问受限文件(/User/user/Library/Messages/xxx)?