Take’s diary

Macとマイコンに関すること--ワクワクの製作日記

iPhone とOFとOpenCV3.4でcontribが実行できないのか?

ご存じの通り

 OpenCVのiOS版にはcontribが付いていません!!。このライブラリは面白そうなものがたくさんあって、どうしても実行したくなるわけです。でも、iPhoneのカメラを使うだけでもテクニックが必要なSwiftやオブジェクティブCから利用するんじゃなかなか難しいのが私の課題。OF(めんどくさいから今後Openframeworksの略)だったら全然問題ないところから、発想が展開していくことになります。

 まず、iOS用の最新OpenCVが存在するって事を知りませんでした。XcodeでのiOS開発はちまたで言うところのクロスコンパイルなんですね。iPhoneじゃ開発能力不足だから母艦iMacでコンパイルしてバイナルファイルをiPhoneに転送するって発想です。これが大きな障害になるポイント。はたして無事インストールできて、OFで使えるのか?でした。

f:id:TAKEsan:20180417212245j:plain

今回はLEPTON3の立体画像をiPhoneで楽しめる上にOpenCVで距離深度を確認、そしてメッシュ変換までです。こんなことやってる方はいないと思うので結構ワクワクでした。なんつったって無線がキクー!!

で、OpenCV for iOSをインストールして見ると

 終わってみるとほんとに簡単でした。標準インストールするだけです。以下はMacでの場合だけなのであしからず。まず標準OpenCV3.4.1のソースコードを

GitHub - opencv/opencv: Open Source Computer Vision Library

そしてこっちのiOS版3.4.1 contribのソースコードを

Releases · opencv/opencv_contrib · GitHub

つまりiOS版の同じバージョンのソースコードをダウンロードします。

 この2つのファイルをダウンロードして解凍した後、自分のMacの作業フォルダにコピーします。まずは、OpenCV iOS版のコンパイルから。これはOpenCV iOS版の標準インストールドキュメント通りです。

  cd /

  sudo ln -s /Applications/Xcode.app/Contents/Developer Developer

  cd ~/<my_working_directory>

  python opencv/platforms/ios/build_framework.py ios

 iOS版の特定ソースはなくて、OpenCV標準ソースファイルでインストールできます。

インストールに使用するpython は2.7.12で、brewCmakeなど私の環境ではインストール済み。つまずいた場合は、自分でなんとかして下さい。コンパイルは私のiMacで30分以上必要でした。

 結果的に自分の作業フォルダにiosってディレクトリができるので、フォルダの中に以下のようにopencv2.frameworkってディレクトリができれば一応完成です。

f:id:TAKEsan:20180319204754p:plain

OFで普通に使えるようにするには

OFは0.9.8です。うまくいけば2ステップで完了。

 まずこんな感じで作ろうとしてプロジェクトに、ビルドしたopencv2.frameworkを追加します。さっきどこにopencv2.frameworkを作ったかを忘れずに!!

f:id:TAKEsan:20180319210148p:plain

で、ofxiOS_Prefix.pch にopencv.hppをインクルード文他を追加します。使いやすいようにこの段階でnamespaceを追加します。#import <Foundation/Foundation>の前に挿入することが重要だったような...。

f:id:TAKEsan:20180319210207p:plain

 試しにこのままビルドしてみてエラーがなければ成功ですが、もしエラーが出ればダメ押しで、以下のようにHeader Search Pathsにopencv2.frameworkの存在する場所を指定してみます。大概この段階で実行可能環境ができてしまいます。

f:id:TAKEsan:20180319210223p:plain

 ビルドエラー無しでここまでできれば、問題はofImageとMatとの変換だけになります。OpenCVとOpenFrameworks間のデータで問題になるのはimgeとMatの相互変換だけで、例えばL_image っていうofImageをOpenCVのimgRっていうMatに変換する場合は、

  cv::Mat imgR = cv::Mat(L_img1.getHeight(),L_img1.getWidth(), CV_8UC3, L_img1.getPixels().getData());

 Matを使ってOpenCVで画像処理を加えた後、ここではtakeっていうofImageに変換すればすぐDrawできちゃいます。

 

   take.setFromPixels( imgR.ptr(),  imgR.cols,  imgR.rows, OF_IMAGE_COLOR, false);

 両者にはRGB BGR変換とかいろいろ中間処理の必要な場合がありますが、基本ポインタ+αなので、実行時は高速変換できてしまいます。(forの二重ループを使うよりはです)

 キーポイントはCV_8UC3 OF_IMAGE_COLORでした。内容は私が説明するより先人がたくさん書いていますので、そちらを参考にして下さい。

じゃーofxOpencvやofxCVはどうなるんだろー

 はっきり言って必要性は感じない。データの変換作業だけが一見やっかいなだけでこつを飲み込めばこっちの物です。なんつったってこっちは最新のOpenCVでーす。

今回の目玉contribはどのようにして実行できるようになるのか?

 肝心のcontrib導入方法です。またまた時間がかかっちゃいますが、今までの処理が無事終わっていれば、再コンパイルするだけで済みます。

 バージョンを合わせたmoduilesの必要なcontribのモジュールフォルダをopencvフォルダにコピーして再度コンパイルし直すだけ!!。私の場合ximgprocが必要だったのでximgprocフォルダをコピーして、OpenCVを再コンパイルするだけでした。少し前はインストールがかなりめんどくさかったようですが、今はぜーんぜん。

f:id:TAKEsan:20180417203036p:plain

                           contribのなかのmoduilesフォルダの中の各ライブラリフォルダを......

f:id:TAKEsan:20180417203006p:plain

                              OpenCVのなかのmoduilesにコピーして再コンパイルするだけ!!

じゃー何ができるの? 

  iOSの場合、C++の方がSwiftより実行スピードが速いって事が経験的に分かってたのですが、OF+Opencv+contribで去年の今頃は、こんなのできるとは思ってませんでした。

              www.youtube.com

今までの集大成です。Swiftなし。OFだけです。Appleのアプリ審査が通れば皆さん簡単に実行できると思うんですが、無料で申請すれば簡単に通ったりして......。

 

 

                           では、また。