前回、Duo256を使って庭にやってくる猫を自動認識し、レリーズ端子に接続した外部デジカメで撮影する事が出来ました。
でも下の写真の様にDuo256と一眼レフを並べるという、面倒な方法になっています。

でもね・・・
わざわざ一眼レフと接続しなくても、Duo256ひとつで撮影まで済ませたいですよね。
Duo256の開発環境はTDL-SDKというライブラリ群を使って行います。これを使ってカメラで撮影するとVIDEO_FRAME_Sという構造体に画像データが入るっぽいので、ここから画像を取り出してファイルに残せば済みそうですが、ドキュメントを見たり色々試したりしても、データを取り出す方法が見つかりません。
またDuo256にはOpenCV mobileというライブラリ群もリリースされていて、こちらを使って撮影する事もできるのですが、今度はYOLOに渡す為に画像をVIDEO_FRAME_Sに入れる方法が分かりません。
ならばこれらのライブラリ使わずにやろうとすると、今度はハードウェアにアクセスする方法が情報不足となるのです。
という状態なので、どなたか分かる方、教えてください。
で、また苦し紛れの対策その2
OpenCV mobileで静止画を撮影するサンプルプログラムと、静止画をYOLOで判定するサンプルプログラムが公開されているので、これらを改造して一旦画像ファイルに書き出したファイルをYOLOで判定する方法でやってみます。
でも毎回SDカードに書くとすぐにFLASHメモリがヤラれそうですよね。
ならばRAMディスクなら問題ないだろな・・・と思ってdfコマンドを実行したところ、/tmpはtmpfsデバイス(≒RAMディスク)をマウントしていました。
という事は/tmpの下に画像ファイルを置けばFDカードに悪影響は無いでしょう。
ではまずyolov5のサンプルプログラムを元に、猫、犬、カップ(デバッグ用)の検出有無を返すプログラムをnekoyoloという名前で作成しました。
次にopencv-mobileサンプルプログラムを元にしてnekoshotというプログラムを作成しました。こちらは静止画を撮影して/tmp下にjpegファイルを作成した後、上のnekoyoloを実行して戻り値が「検出あり」ならその画像を改めてSDカードに書き出す・・という動作を繰り返します。なおSDカードに書き出すファイル名は重複しない様に連番を付けておきます。
図にすると以下の感じ・・・

nekoyoloプロセスはその都度生成しては消えるので、起動のオーバーヘッドが加わりますが、今のところ2秒周期程度で繰り返しているのでまあ良しとします。
動かしてみる。
ではまた窓ガラスに貼り付けて動作させてみます。
前回の様に横に一眼レフを置く必要が無いので設置は簡単です。

Duo256とPCの間はUSB-NCMで接続しているので、動作しながらも下図の様にWinSCPで様子を見る事ができます。
下図の5つの画像ファイルの内、最初の3つは例によって動作確認用のカップの画像で、最後の2つには猫が写った様です。
なおDuo256内にはバッテリ駆動の時計は無いのでファイルの更新時刻はメチャクチャです。(USB-NCMではなくEthernet接続にすればNTPで時刻を合わせられる気がする)

早速ファイルを開いてみると・・・お、いるいる。

そしてもう一枚。

前回撮れた2枚の写真とは違う猫に見えますね。
もう暫く動作させてみましょう・・・
そして後日もう一枚。走ってる走ってる。

上のと同じ猫かもしれませんがハッキリ見えません。
・・・という事でDuo256単体で猫検出&撮影ができる様になりました。
こうなるとPCとは接続せずにモバイルバッテリーから電源を入れて放置するだけで撮影したいです。これには電源を入れたら勝手にnekoshotが起動する必要があります。
普通のLinuxだと/etc/rc3.dの下に設定ファイルを置いたりしますが、Duo256の場合/mnt/system/auto.shが起動時に実行される様なので下記の様に記載しました。
なおnekosyotとnekoyoloの実行ファイルは/root//workの下に置いています。
またLD_LIBRARY_PATHを設定しておかないとyoloがライブラリを見つけられませんでした。

プログラム
今回のプログラムです。
/data/nekoshot.tar.gz
/data/nekoyolo.tar.gz
コンパイル済バイナリも含んでいますが、再コンパイルする場合は前回のライブラリに加えてopencv mobileライブラリが必要です。インストール方法は本家の下記ページに記載があります。
https://milkv.io/docs/duo/resources/opencv-mobile
ライブラリの配置は下記前提にしています(これと違う場合はMakefileを要修正)。
~/milkv
├duo-examples
├cvitek-tdl-sdk-sg200x
├opencv-mobile-4.10.0-milkv-duo
├host-tools
└myproj
├nekoshot
├ ├Makefile
├ └nekoshot.cpp
└nekoyolo
├Makefile
└nekoyolo.cpp