読者です 読者をやめる 読者になる 読者になる

Raspberry Pi / Python3 / OpenCV3 Tracking Sample

先日のTrackingサンプルをRasPi + Python3で実験。解像度おとしてるけど、やっぱり重いかも。

youtu.be

ソースはこちら。OpenCV3でかなりAPIが変わったぽくて、Python3 + OpenCV3な情報が少なかった。

gist.github.com

参考リンク

Cinder / OpenCV3 Tracking Sample

Cinderで、OpenCV3のTracking APIを試してみました。

すごい簡単にTracking APIできることを説明すると、この選択したエリアにある何かをトラッキングして!ということができるもの。マーカーでもないし、自動認識でもないけど。人の顔を角度が変わっても追跡しつづけるし。結構使えそうだなと。

プロジェクトのソースはこちら。
GitHub - asus4/CinderOpenCv3Sample: OpenCV 3 Tracking API

Cinderを初めて試してみて、oFではapps以下にプロジェクトを作る暗黙のルールがあったけれども、CinderではCINDER_PATHを設定するだけで良いのでプロジェクト作るのが楽な印象でした。あとはofxアドオンみたいにライブラリが増えたらなー。

参考リンク

ESP32 ネットワーク周りの設定をしらべる

プロトタイプを作るときにESP32いいですよね。

akizukidenshi.com

秋月電子で1個1,480円
安くて高性能なので、ネットワーク使わない案件でも選択肢に入るんじゃないかと。

ESP32はBluetooth/2.4GHz Wifiモジュールが付いてるので簡単にIoTっぽいことが初められます。
でも毎回問題になったりならなかったりする、ネットワーク周りの設定。有線最高。
ソースコード直打ちでやってしまうこともあるけれども、
納品など環境変わったときにめんどくさいし、もうちょっとちゃんとしたいなと思って、
ネットワークの設定について調べてみました。

※サンプルはarduino-esp32環境ですが、esp-idfでも同じことできます。

IPアドレスの自動化

mDNS

Zeroconf - Wikipedia

Apple Bonjourといっていたやつ。

サーバー側で、_myservice._tcp.localみたいなサービスを立ち上げておくと、ESP32側から特定のサービスを検索して、そいつのIPアドレスがわかる。 ラズベリーパイも最近は、raspberrypi.localでアクセスできるし。

mDNSでネットワーク内のサービスを探すサンプルはこちら。
arduino-esp32/mDNS-SD_Extended.ino at master · espressif/arduino-esp32 · GitHub

OTA Update

mDNSサービスをESP32側で立ち上げてみる。すると今度はArduino IDEから、WiFi経由でスケッチのアップロードができるようになるみたい。サンプルコードはこちらに。

arduino-esp32/BasicOTA.ino at master · espressif/arduino-esp32 · GitHub

すごいかんたんたん。そしてシリアル接続より早いw

余談だけど、僕はplatformioで開発していて。ESP32だとplatformioからのOTAアップデートのスクリプトがエラー出ていたので修正コード。
gist.github.com

WiFi設定の自動化

以上で、IPアドレスの直打ちは撲滅できそうだけど、
WiFiSSID,パスワードを設定するという難関がまだ残っています。
これもなるべくシンプルにできないかと調べてみました。

Blufi

ESP32はBluetoothモジュールも搭載していて。BLEで繋いで、ネットワーク設定をアプリから送ればいいだろうと。
色々調べるうちに、Blufiというライブラリが見つかった。arduinoのラッパーはなかったけど、esp-idfのライブラリも普通にarduino上で動いた。

サンプルはここに。 esp-idf/examples/bluetooth/blufi at master · espressif/esp-idf · GitHub

Androidアプリから接続するみたい。 EspBlufi/releases at master · EspressifApp/EspBlufi · GitHub

…しかし、手元に対応するAndroidがなかったので断念。
ESP32限定でよければこれがスマート。

WiFiManager

さらに調べていくうちに、WiFiモジュールのみのESP8266で動くWiFiManagerというライブラリが見つかった。

GitHub - tzapu/WiFiManager: ESP8266 WiFi Connection manager with web captive portal

基本的には、設定したアクセスポイント(AP)に接続する。
初回起動時や、接続に失敗したときは、デバイス側がAPになって、
アプリからつなぎたいWiFiSSIDとパスワードを設定してあげるというやつ。
最近のIoTな製品でよくみるパターンです。

WiFiManagerは更に、設定用のhtmlも生成してくれるので、わざわざ専用アプリを用意しなくても、ブラウザから設定できる。

…でも、ESP32は対応してなかった。

Smart Config

ESP8266 / ESP32どちらも対応していたのが、SmartConfig

arduino-esp32/WiFiSmartConfig.ino at master · espressif/arduino-esp32 · GitHub

こちらはアプリが必要

ライブラリが公開されてるので、自分のアプリにも組み込める。

これは、WiFiManagerの仕組みとにているけれど、デバイスのAPにつなぎ直す必要がない。
スマートコンフィグモードにはいると、なぜか別ネットワークにいるESP32に、SSID / Passwordを送れる。

はて、同じネットワークにないのに通信するとは、どういうこと?とiOS版のソースコードをよむとブロードキャストアドレスにUDP 送ってるぽい。
そして、ESP側が、スマートコンフィグをするときに、Snifferモードなるものに入るらしい。参考ブログ

Snifferモードで繋がっていないWifiネットワークから情報をとってこれると。
セキュリティ怖い気がするけども、AOSSなどの例もあるし大丈夫なのかな?もう少しSmartConfigは調べてみたい。

でもひとまず、mDNSとSmartConfigで、ソースコードIPアドレスも、SSID / Passwordもなにも書かないでよくなるので、環境変わっても大丈夫。

iOS/Androidで4k動画を再生できるか調べる + Unityプラグイン

360°動画を再生するUnityスマホアプリ増えてる。
スマホで360°動画を再生するときにやはり気になるのは、解像度。画面の解像度はどんどん上がっているのに、FullHDだとかなり汚く見えてしまう。

iOSではiPhone6s以上から。Androidでも2016年に発売されているものは4k再生をサポートしているのが多い。
そこで、サポートしているものは4k, それ以外はFullHDを再生するために、そもそも指定のフォーマットをサポートしているか調べるネイティブプラグインを作ってみました。

Unity5.6のVideoPlayerはいけてるけど、まだAndroidはサポートしてないので、EasyMovieTextureで確認。

GitHub - asus4/unity-video-supported-plugin: Check iOS/Android supported video format from unity

使い方は簡単。

using AppKit;

VideoSupported.IsSupported(1920, 1080, 29.97f);
VideoSupported.IsSupported(3840, 1920, 29.97f);

手元の環境ではうまく言ってるんだけど、Android端末をそんなに持ってないので、
試して問題合ったらプルリクください。

OpenCV3 + opencv_contrib on macOS

OpenCV3のトラッキングAPIを使いたくって、macOSでインストールが面倒だったので、メモ。

TL;DR

MacBook Pro (15-inch, 2016)で動く
OpenCV 3.2.0(相当)のフレームワーク置いときました。
http://ibu.tokyo/downloads/opencv-3.2.0.framework.zip

homebrewで入らない

プロトタイプ作業だったので、pythonでやりたいし、homebrewで簡単に入れたかった。

理想はこのオプション

brew install opencv3 --with-contrib --with-ffmpeg --with-python3 --without-python

なんかエラー出る…

brew install opencv3 --without-python --with-python3
brew install opencv3 --with-contrib

これでも駄目。issue見てもいまいちわからず。
なにもオプションつけないビルド済みのもの以外入らないんじゃ…
余談だけど最近のhomebrewはインストールみすると、関連するissueをログに吐いてくれるの便利。

あきらめてソースからビルド

最新のリリースv3.2.0を以下からダウンロード。

github.com github.com

opencv_contrib/README.md
に書いてある方法はなぜかめんどくさい方法になっていたけど、frameworkビルド用のスクリプトが用意してあるぽい。

python opencv/platforms/osx/build_framework.py --contrib opencv_contrib build

やったービルドできた。
しかし実行するとTracking moduleが入ってない…。

std::cout << cv::getBuildInformation() << std::endl;

でビルド情報が見れるらしく。
どうやら、依存しているdnnのせいで、trackingモジュールが入ってないぽい。
dnnはディープ・ニューラル・ネットワークのモジュールでCaffeのモデルを読んだりできるらしい。
dnnのCMakeListsを読むと、CUDA使えない環境では使えないようにしている。これ、AMD RadeonMacじゃ使えないんじゃ…。

あとで調べるとADMでCUDA動かすプロジェクトもあるみたい。だけど流石にそこまではできない。 CUDAをRadeonで動かす(導入編) - Fixstars Tech Blog /proc/cpuinfo

masterビルドできる

で半分諦めるものの、Githubの中を追っているうちに、masterブランチでは修正されていることに気づいた。
同じ方法でmasterブランチ上でビルドすると今度は無事にdnnモジュール、trackingモジュールも入った。

ビルドしたモジュール: core flann imgproc ml objdetect phase_unwrapping photo plot reg surface_matching video xphoto bgsegm dnn face fuzzy imgcodecs shape videoio xobjdetect highgui superres bioinspired dpm features2d line_descriptor saliency text calib3d ccalib datasets rgbd stereo structured_light tracking videostab xfeatures2d ximgproc aruco optflow stitching world

入ってないモジュール: cudaarithm cudabgsegm cudacodec cudafeatures2d cudafilters cudaimgproc cudalegacy cudaobjdetect cudaoptflow cudastereo cudawarping cudev java python2 python3 ts viz cnn_3dobj cvv dnn_modern freetype hdf matlab sfm

macは好きだけど、開発ではどんどん使えない子になっている…。

サンプル

contribに入っている、ArUcoのマーカーを吐き出すだけの、一番シンプルなサンプル。 github.com

Xcodeでビルドするときに依存ライブラリはこちら。 f:id:asus4:20170521102143p:plain

cv::imwriteとうのファイル読み書きにWebP.framework入れろって怒られたので、iOS用のリンクしたら普通にビルドできた。
oFなどで使う場合はimwrite,imread使わないので、WebPなくても大丈夫。


マスト丼にログ残す実験をして、
ハマったところを後でブログに残そうって思ったりするのでhatenaさんとか、qiitaさんとかのインスタンスが立ったらいいなー。
https://mstdn.jp/@asus4