質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

3872閲覧

xcode "OpenCV 4.x+ requires enabled C++11 support"のエラー

chestnutforest

総合スコア9

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/04/03 07:45

編集2020/04/03 14:51

###自己紹介
研究でiOSアプリ開発をしている学生です。よろしくお願いいたします。

前提・実現したいこと

OpenCVのライブラリを用いたiOSアプリを制作をしております。まずはiOS上でOpenCVのcalcHistを用いてカラーヒストグラムの作成に取り掛かっています。OpenCVをラップしてswift上で動かそうとしているのですがビルド時に"OpenCV 4.x+ requires enabled C++11 support"というエラーが発生してしまいます。

このエラーが発生した経緯としては
1.IplImageをxcodeが認識できない→"Expected a type"というエラー発生
2.OpenCVWrapper.hに <#opencv2/core/types_c.h> と記載。上記のエラー解決。
3.この上でビルド時に "OpenCV 4.x+ requires enabled C++11 support" が発生。

発生している問題・エラーメッセージ

"OpenCV 4.x+ requires enabled C++11 support" //まず最初に解決したいエラー "'array'file not found" //これは上記のエラーを解決すればともに解決されるらしい

該当のソースコード 

OpenCVWrapper.h

C++

1#ifndef OpenCVWrapper_h 2#define OpenCVWrapper_h 3#endif /* OpenCVWrapper_h */ 4#import <UIKit/UIKit.h> 5#import <opencv2/core/types_c.h> /* "Expected a type"というエラー解決のために追加 */ 6 7@interface OpenCVManager : NSObject 8+(void) makeHistgramFromImage:(UIImage*)image; 9+ (IplImage *)createIplImageFromUIImage:(UIImage *)uiImage; 10@end

OpenCVWrapper.mm

C++

1#import <opencv2/opencv.hpp> 2#import <opencv2/imgcodecs/ios.h> 3#import <opencv2/imgproc/imgproc_c.h> 4#import <opencv2/core/types_c.h> 5#import "OpenCVWrapper.h" 6 7@implementation OpenCVWrapper 8 9+(void) makeHistgramFromImage:(UIImage *)image 10{ 11 12 cv::Mat imageMat; 13 UIImageToMat(image, imageMat); 14 15 cv::Mat grayMat; 16 cv::cvtColor (imageMat, grayMat, CV_BGR2GRAY); 17 image = MatToUIImage(grayMat); 18 19 IplImage *gray = [OpenCVManager createIplImageFromUIImage:image]; 20 21 float range[]={0,255}; 22 23 float* ranges[]={range}; 24 int histSize; 25 histSize=256; 26 CvHistogram* hist; 27 28 hist=cvCreateHist(1,&histSize,CV_HIST_ARRAY,ranges,1); 29 30 cvCalcHist(&gray,hist,0,NULL); 31 32 cvReleaseImage(&gray); 33} 34+ (IplImage *)createIplImageFromUIImage:(UIImage *)uiImage 35{ 36 CGImageRef imageRef = uiImage.CGImage; 37 CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 38 IplImage *iplimage = cvCreateImage(cvSize(uiImage.size.width, uiImage.size.height), IPL_DEPTH_8U, 4); 39 40 CGContextRef contextRef = CGBitmapContextCreate( 41 iplimage->imageData, 42 iplimage->width, 43 iplimage->height, 44 iplimage->depth, 45 iplimage->widthStep, 46 colorSpace, 47 kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); 48 49 CGContextDrawImage(contextRef, CGRectMake(0, 0, uiImage.size.width, uiImage.size.height), imageRef); 50 CGContextRelease(contextRef); 51 CGColorSpaceRelease(colorSpace); 52 53 IplImage *outputImage = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3); 54 cvCvtColor(iplimage, outputImage, CV_RGBA2BGR); 55 56 cvReleaseImage(&iplimage); 57 return outputImage; 58} 59@end

openCV-Bridging-Header.h

C++

1#import"OpenCVWrapper.h"

opencv2.framework/Headers/core/cvdef.h 一部抜粋 line 691~705

C++

1#ifndef CV_CXX11 2# if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800) 3# define CV_CXX11 1 4# endif 5#else 6# if CV_CXX11 == 0 7# undef CV_CXX11 8# endif 9#endif 10#ifndef CV_CXX11 11# error "OpenCV 4.x+ requires enabled C++11 support" //この文でエラーが起こっている 12#endif

試したこと

Build Settings → Basic → Levels
C++ Language Dialect をC++11に変更
C++ Standard Libraryを libc++(LLVM C++ standard library with C++11 support)に変更

今現在はopenCV 4.xを使っていて多くのサイトではopenCV3.xを使えばよい(C++11に対応したのは4.xからだかららしい)と書いてあったので、openCV3.xを導入してみましたがライブラリ内部でエラーが起きていてエラー天国だったのでこちらはあきらめました。

どうやってこのエラーを解決するのでしょうか?(エラー文に言われているようにC++11をenableにすればいいのだろうけれども)そもそも最初のIplimageに対して出ていた"Expected a type"のエラーの対処法が間違っているのが...という感じです。

色々なサイトの回答を見ましたが全く分からず、このエラーともう3日戦い続けてます....
コンピュータにはすごく詳しいほうではないので、もし回答いただけましたらどこから何をやるか具体的に教えていただけると非常に助かります。

以上のコードは
https://teratail.com/questions/129039
を参照にしております。

補足情報(FW/ツールのバージョンなど)

xcode 11.4
openCV ver4.2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ch3cooh

2020/04/03 13:12

OpenCVはどのようにインストールされましたか? CocoaPods経由でOpenCVをインストールしているからか、そのようなエラーに遭遇したことがありません。もし可能でしたらエラーが発生する部分だけのミニマムプロジェクトをご提供いただけないでしょうか。
chestnutforest

2020/04/03 13:32

以下のサイトを参考にインストールしました。 https://blog.fenrir-inc.com/jp/2017/04/opencv-3-2-in-a-swift-project.html エラーが発生する部分は上記の opencv2.framework/Headers/core/cvdef.h の部分だけです。 自分では今のところIplImageはopenCV4.xではもう使われていないらしくて(stackoverflowより)それを無理やり使おうとしているからなのかなと......ただ使いたい関数であるcalcHistの引数はIplImageなので.....
ch3cooh

2020/04/03 14:09

本文を読めておらず申し訳ございません。理解しました! Iplimageをプロジェクト全体で使おうとして苦労されているようですので、OpenCVやIplImageのややこしい処理は *.mmファイルに押し込んでしまってみてはいかがでしょうか。 (OpenCVでの計算結果のみ返す、加工後の画像をUIImageを返すようにする など) * https://github.com/CH3COOH/SampleOpenCVHistgram/blob/master/SampleOpenCVHistgram/OpenCVWrapper.h * https://github.com/CH3COOH/SampleOpenCVHistgram/blob/master/SampleOpenCVHistgram/OpenCVWrapper.mm
chestnutforest

2020/04/03 14:30

まだ具体的な画像を入れて試してはいないですが、何とか見せていただいたレポジトリを参考にエラーを消すことができました! わざわざ私のような未熟者に時間を割いていただいた上にこの質問専用のレポジトリを作っていただきありがとうございます! 是非ともベストアンサーに選びたいので,回答欄に再度同じ回答を書いていただけると嬉しいです。
ch3cooh

2020/04/03 14:34

ありがとうございます!お役に立てて何よりです。
guest

回答1

0

ベストアンサー

IplImageをプロジェクト全体で使おうとして苦労されているようですので、OpenCVやIplImageのややこしい処理は *.mmファイルに押し込んで、Swift側からは隠蔽してみてはいかがでしょうか。
(OpenCVでの計算結果のみ返す、加工後の画像をUIImageに変換してから返す など)

以下のようにすると、エラーは発生しなくなります。

投稿2020/04/03 14:38

編集2020/04/04 06:49
ch3cooh

総合スコア287

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問