openCV3/4のメモ

openCV3/4のメモ

要約

openCv4をopenframeworksで使うまでの手順。
プロジェクトの生成については、ほかサイトで見なかった簡単な方法をメモ。
めちゃ雑記です。

概要

oFでopenCV3とか4とか使ってみます。
この記事この記事にそって進めてみる。
opencv4でないといけないことは特にないです。ただただBackgroundSubtractorを試してみたかった。
後日また雑な記事かきます。テストの動画だけ貼っときます。なにかのための証拠。

環境とりあえずMac

openCVのinstall

まずはopenCV3 or 4のインストール。
※ 基本最新で上書きされるっぽい。3,4を共存させる方法もあるらしいが、自分は openCv4.1.0でこれといって不具合はないので、opencv4のみになっています。

brew tap homebrew/scienceは使えなくなったらしい。参考
そのため brew tap brewsci/science こちらのコマンドで環境アップデート。

  • opencv3の場合
    brew install openCV3で入れる。
  • opencv4の場合
    opencv4についてはこちらが詳しい。
    brew upgrade opencv でopenCV4(最新版 ex: 4.1.0)を入れる。
途中xcodeのコマンドラインをインストールしてね的なエラーが出たので、xcode-select --installをして、再度upgradeかけると、エラーなく無事完了した。  
過去に入れた気がするのにと思っていたけど、どうもOSをアップグレードすると再度入れる必要があるらしい。  

普通にすすめると、たいていは/usr/local/Cellar/opencv/が更新されるはず。

Xcodeで新規プロジェクト作成

色んなサイトでは以下の方法があげられていたが、パス間違える可能性があったり、記入が面倒だったりなので、個人的にはおすすめじゃない。

紹介されていたプロジェクト生成方法

open
  1. Project.xcconfigでOPENCV_PATHを設定 パスは適宜変えてください。
//OpenCV3
OPENCV_PATH = /usr/local/Cellar/opencv/3.4.1_2
//OpenCV4
OPENCV_PATH = /usr/local/Cellar/opencv/4.1.0_2  
  1. BuildSettingsのHeader Search PathsにOpenCVのインクルードパスを追加
    $(OPENCV_PATH)/include/opencv4
  2. Build SettingsのOther Linker Flagsに必要なdlybを追加
    ここが面倒、、

openCV4をインストールすると、libフォルダにdylib以外に.aファイルもありました。
これらおそらく中身は同じですが、動的ライブラリか、静的ライブラリかの違いがあります。  
こちらでは動的のほうがファイルサイズ小さく、使用メモリも少なくできるっぽい。
dylibを追加するのが面倒な場合は、
.aファイルをGeneralのLinked Frameworks and Librariesにドラッグドロップしても起動可能です。

(たぶんProject.xcconfigのOTHER_LDFLAGSこのあたりの設定でどうにかなるのだけど、、)

#include <opencv2/core.hpp>ここでリンク貼れてないよってエラー出たけど、単純にheader search pathに$(OPENCV_PATH)/includeを入れてないのが原因でした。

おすすめの生成方法

ProjectGeneratorでプロジェクトを作り、

  1. プロジェクトのSearchPaths > HeaderSearchPathsに/usr/local/Cellar/opencv/4.1.0_2/include/opencv4 を追加。(パスは適宜変更してください。)
  2. /usr/local/Cellar/opencv/4.1.0_2/libから必要なdylibを General>LinkedFrameworks and Libraries にドラッグドロップで追加

どのヘッダ呼び出すときにどのlibが必要になるのか、どこを見ればいいんだろう。。。今の所勘で追加しています。。。
このやり方が簡単安定な気がする。Debug/Releaseで変更の必要ない?
紹介されていたプロジェクト生成方法だと必要かもだけど。


画像は適当に追加したのでごちゃっとしています。どうやら.aの静的ライブラリよりは、.dylibなど動的ライブラリのほうが実行ファイルが軽く、メモリの消費を抑えられるとかどうとか。。。

ofxCvとの連携と利用

oFでopenCVを扱う際に、関数群を使いやすくまとめてくれているofxCvを使うとめっちゃ便利。

ProjectGeneratorでofxCvのみ追加してプロジェクト生成。
あとは、上の1.2.を同様に。
なんかもしかしたら、もうちょうっと設定必要だったかも。わすれてもうた。


おまけめも

ofxOpenCvDnnSegmentation など

やはりどこにでも先人がいるもので、馬場先生のofxOpenCvDnnSegmentationがあった。openCVのdnnライブラリをいろいろまとめてらっしゃる。

配布されていたopencv2.aでうまくいかなかったので、自分でメイクしてみる。参考

が、原因はどうもそこではなかった。ので、makeの手順は隠す。

makeの手順
  1. python build_framework.py osxを実行するが、python3ではうまくいかないみたい。
    自分の場合は python2 build_framework.py osc とするとうまくいった。
    python -Vでバージョンを確認したり、which python, which python2でpythonの2.7以上が使われているか確認するとよさそう。
    参考1 参考2

エラー(returned non-zero exit status 65)について
** BUILD FAILED **

The following build commands failed:
    CompileC /Users/hiraoshugo/openCV/opencv-4.1.0/platforms/osx/osx/build/build-x86_64-macosx/modules/world/OpenCV.build/Release/opencv_world.build/Objects-normal/x86_64/opencl_kernels_video.o /Users/hiraoshugo/openCV/opencv-4.1.0/platforms/osx/osx/build/build-x86_64-macosx/modules/world/opencl_kernels_video.cpp normal x86_64 c++ com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
============================================================
ERROR: Command '['xcodebuild', 'MACOSX_DEPLOYMENT_TARGET=10.12', 'ARCHS=x86_64', '-sdk', 'macosx', '-configuration', 'Release', '-parallelizeTargets', '-jobs', '4', '-target', 'ALL_BUILD', 'build']' returned non-zero exit status 65

こんなエラーでた。どうやらcmakeのバージョン(3.10.2)がダメらしい。参考
てわけで、cmakeのupgrade

cmake --version
// cmake version 3.10.2
brew upgrade cmake
// .....
cmake --version
// cmake version 3.15.2
python2 build_framework.py osx
// .....

  1. python build_framework.py –contrib <opencv_contribへのパス> osx

そんなこんな。。

結論、こちらのように#include "opencv2/imgproc/imgproc_c.h"をofxCvのWrappers.hに追加した。

modelデータは以下から直接落とした。
http://dl.caffe.berkeleyvision.org/fcn8s-heavy-pascal.caffemodel


最近いろんな出会いがあって楽しい。特に音楽やってる人とよく出会う。
春よりも春らしい。

明日は学生CGコンテスト25周年のパーティーにいってきます。
夏がもうすぐ終わるからね。季節の変わり目。春の訪れ。
秋はいずこへ。

openframeworksでカメラが使えなくなった

openframeworksでカメラが使えなくなった。
ofAVFoundationGrabber.mmの
[self.captureSession addInput:captureInput];
でエラーが出る。
QuickTimeなどではちゃんとカメラが動作するので、oFかXcodeの設定かなと踏んでいた。

open

結論としては、Macのシステム環境設定でセキュリティとプライバシーのカメラの設定で、oFのアプリのチェックが外れていた。
何がきっかけで外れたのか、何を思ったか昔の私がチェック外したのか。。

エラー内容は以下みたいな。

An uncaught exception was raised
~~
Terminating app due to uncaught exception &#039;NSInvalidArgumentException&#039;
~~
libc++abi.dylib: terminating with uncaught exception of type NSException

ちょっと話は違うけど、以下を読んで、ふとプライバシーの設定のことを思い出した。
https://github.com/openframeworks/openFrameworks/issues/6193

コンソールのエラーログにもセキュリティ的な話がなく、
再起動しても、新しくoFの環境作ってVidoGrabberExampleをビルドしても、同様のエラーが出ていたので、悩みました。
気づいてみれば簡単なことなのに、、残念な経験は案外忘れているんですね。


iOSアプリの設定で変数など管理

iOSアプリを作ったときに、
アプリを入れたあとで、コンテンツの中身を書き換えたい場合。

たとえば、
OSCを使うためIPアドレスをアプリに設定したい。
アプリの向きを変えたい。
デバッグモードのトグルで切り替えたい。
などなど。

上みたいな設定ができると、作ったアプリにちょっと愛着わいてモチベ上がる。

サイネージのお仕事でiPadなどの端末からコンテンツを操作するということが
最近ふえたので、そのときにしておくと親切なTipsです。

openFrameworksでiOSを開発する際にはofxSettingsが便利でした。
https://github.com/prossel/ofxSettings

 


詳細な設定は文末の参考リンクにまるなげ。

設定の大体の流れは、
1. srcなど右クリックでSettings.bundleファイルを追加する。
2. Root.plistに表示したい項目を追加。
3. Keyの値を利用して、端末の設定画面で入力した値をアプリ起動時などに変数へ格納する。(ofxSettingsではSettings::get~()で取得)
4. 取得はせず設定画面に表示したいだけの場合はKeyの値を利用してSettings::set~()で。
5. ビルド時の情報を表示させたい場合は、BuildPhases

 

APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:9:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

date=$(date "+ @ %Y.%m.%d %H:%M")
BUILD_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" $PRODUCT_SETTINGS_PATH)$date
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:10:DefaultValue ${BUILD_NUMBER}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"

RunScriptで上のような記述をします。
1行目:APP_VERSIONという変数にxcodeで指定しているアプリのバージョンを代入
2行目:plistのitem9DefaultValueをAPP_VERSIONに書き換え
みたいな感じでしょうか。
何項目め、みたいな指定しかできないのかな。ちょっと調べてみたけどなさそう?

xcodeからAddRowとかして追加するとなんか表示変になっていたりすることがあるので、plistファイルを他のエディタで開いてxmlとして直接編集した方が無難かも。
xcodeで編集できる方がitemのナンバーとかわかりやすいけど。

'date=$(date "+ @ %Y.%m.%d %H:%M")' などを追加して
ビルド時の日時なども記載しておくとデバッグなどでは便利かも
http://goozenlab.com/blog/2015/02/06/versionning/


参考
https://dev.classmethod.jp/smartphone/iphone/settings-bundle-acknowledgements/
https://qiita.com/akatsuki174/items/392cb3be619fabfa4608

 

IPアドレスを取得する_oF_osx(C++)

openFrameworksなどでアプリを動かしているPCのIPアドレスを取得したい。

Mac OSXの話。
参考(というかほぼまるまる):
http://www.geekpage.jp/programming/linux-network/get-ipaddr.php

oFなどでofMain.hをincludeしていれば
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
#include <arpa/inet.h>
のインクルードでOK

ネットに繋がっていない場合は
255.127.0.0
とか返ってきた。(要検証)

ネットに繋がっていない状態でも何かしらそれっぽいIPアドレスが返ってきたので、
[*] check good IP のところで、最後の値を見て、感でぽい処理を追加しただけ。

OSCを使うとき、IPアドレスで確認して接続+立ち上げするようにすれば、
とっても親切で徳が高い。

ちなみにiOSでも上のコードで取得できた!シンプルでよき。

WindowsではWinsockを使うとできそう。
個人的にはいまのところ需要ないので、またこんど。
https://clown.hatenablog.jp/entry/20081225/p1

 

 

openFrameworksよく使うスニペット

私がよく使うスニペット?定型?的なものをGistにまとめていきます。
今後も時々更新します。たぶんぜったいこうしんします。

参考になれば幸いですし、できれば人のものも知りたい。。
ちなみに環境はMac、oF0.10.0で使うものが多いですが、特に関係なく使えるものが多いはず。

 

ちなみに私はこういったものをポンと出せるように
Clipy(https://clipy-app.com/)というアプリを使って活用しています。
わりかし便利な気がしていますが、ほかにもオススメな方法があればぜひ教えていただければ幸いです🙇‍♂️