emoiの日記

忘れっぽい雑食系エンジニアのメモblogです。

OpenCV を使って Android で MobileNet-SSD を動かす

環境

Ubuntu 16.04
Android Studio 3.1.3
OpenCV 3.41
Nexsus 5

はじめに

OpenCV公式のサポートスタンスはここに明記されている。

We’re not aiming to teach you all about Android

Android - OpenCV library

初期設定手順

まずはOpenCVのセットアップと Hello World
OpenCV for AndroidをAndroid Studioに導入するメモ

f:id:r17u:20180622103959p:plain

MobileNet-SSD サンプル

OpenCV: How to run deep networks on Android device
Nexus5だと処理が重いがなんとかリアルタイムでできている。
f:id:r17u:20180622103144p:plain

エラー対応

  • error: cannot find symbol variable hoge

コード該当箇所にカーソルを合わせて「alt+enter」を押下すると、import欄に自動で追記され、再度ビルドするとエラーがなくなる。

  • 実機を認識させる

Ubuntu + Android Studioで実機をUSBに接続してデバッグ - Symfoware

  • 'com.android.tools.build:gradle:3.1.3'が無いとエラーが出たら、repositoriesにgoogle()を追加。

android - Can not find gradle 3.1.1 - Stack Overflow

  • Error: Your project contains C++ files...

LLDB, CMake, and NDK をインストール
Add C and C++ code to Your project  |  Android Developers

  • Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'.

Android Studioの新コンフィグレーションimplementationとapiのひとつ注意点

  • Error: Your project contains C++ files but it is not using a supported native build system.

落書き帳: Android Studio への移行
LobiのAndroidアプリ開発を Android Studio 3.0 に移行しました! - KAYAC engineers' blog

  • Camera is not available (in use or does not exist): Fail to connect to camera service

カメラの権限をonにする

  • No implementation found for long org.opencv.dnn.Dnn.readNetFromCaffe_0

.caffemodelおよび.prototextファイルパスがあっているか確認。
次はOpenCV Manager のverを確認。アップデートする。
Failed to load mobilenet-ssd caffemodel. · Issue #9904 · opencv/opencv · GitHub
androidのcpuを調査

~/Android/Sdk/platform-tools$ adb shell cat /proc/cpuinfo

インストール

~/Android/Sdk/platform-tools$ adb install /home/hoge/OpenCV-android-sdk/apk/OpenCV_3.4.1_Manager_3.41_armeabi-v7a.apk
3888 KB/s (11490451 bytes in 2.886s)
	pkg: /data/local/tmp/OpenCV_3.4.1_Manager_3.41_armeabi-v7a.apk
Success

Success の代わりにFailure [INSTALL_FAILED_UPDATE_INCOMPATIBLE]が出たら、
Android実機に既に入っているOpenCV Managerをアンインストールして再度試す。