AndroidStudio で OpenCV をインポートする
の続きです。
概要
Android 用 OpenCV には、
8個のサンプルが同封されている。
そのうち mixedprocessing は、
Native API を使うサンプルサンプルです。
前回の記事で作った Android のライブラリをインポートする手法は使えないので、
アプリごとに Android 用のOpenCV をインポートしてビルドする。
tutorial-2-mixedprocessing
OpenCVの Java API と Native API の2つの方法で、
カメラからの画像を変換して、表示するサンプルです。
メニューは下記の4つ
-
Preview RGBA
カメラ画像をカラーで描画する -
Preview Gray
カメラ画像をグレースケールで描画する -
Canny
キャニー ( Canny) 法によりエッジを検出して描画する -
Find feature
Native API により特徴点を検出して、小さな赤い丸を描画する
アプリを作成する
まず、下記の記事をお読みください。
(1) 新規のプロジェクトを作成する
File -> New -> New Project -> Empty Activity
(2) OpenCV の Android SDK をインポートする
File -> New -> Import Module
(3) 依存関係を設定する
File -> Project Structure
(4) opencv/build.gradle を修正する
(5) AndroidManifest にカメラのアクセス許可を追加する。
(6) レイアウトファイルに、JavaCamera2View を配置する。
(7) MainActivity.java を作成する。
samples/tutorial-2-mixedprocessing/src/org/opencv/samples/tutorial2/Tutorial2Activity.javaを
app/src/main にコピーして、
MainActivity.java にリネームする。
public class MainActivity extends CameraActivity implements CvCameraViewListener2 {
public native void FindFeatures(long matAddrGr, long matAddrRgba);
public void onCreate(Bundle savedInstanceState) {
// 省略
}
public void onResume() {
// 省略
}
public boolean onCreateOptionsMenu(Menu menu) {
// 省略
}
public boolean onOptionsItemSelected(MenuItem item) {
// 省略
}
public void onCameraViewStarted(int width, int height) {
// 省略
}
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// 省略
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
public void onManagerConnected(int status) {
// 省略
}
};
(8) native コードを作成する。
samples/tutorial-2-mixedprocessing/jni ディレクトリを
app/src/main にコピーして、
cpp にリネームする。
プロジェクトのファイル構成に合わせて変更する。
/**
* org_opencv_samples_tutorial2_Tutorial2Activity を
* jp_ohwada_android_opencv48_MainActivity に変更する
*/
JNIEXPORT void JNICALL Java_org_opencv_samples_tutorial2_Tutorial2Activity_FindFeatu
(9) app/build.gradleを変更する
defaultConfig {
ndk {
abiFilters 'armeabi-v7a'
}
externalNativeBuild {
cmake {
arguments "-DOpenCV_DIR=" + project(':opencv').projectDir + "/native/jni",
"-DANDROID_TOOLCHAIN=clang",
"-DANDROID_STL=c++_shared"
targets "mixed_sample"
}
buildTypes {
externalNativeBuild {
cmake {
path 'src/main/cpp/CMakeLists.txt'
}
}
(10) cmake を修正する
Make するとエラーが出るので、
cmake を修正する
(11) Makeする
Build -> Make Projec
cmake を修正する
Makeすると、
エラーが出るので、
プロジェクトのファイル構成に合わせて
下記の2つの cmake を修正する
- opencv/native/jni/abi-armeabi-v7a/OpenCVConfig.cmake
- opencv/native/jni/abi-armeabi-v7a/OpenCVModules-release.cmake
CMake Warning at /Users/ohwada/AndroidStudioProjects/Opencv48/opencv/native/jni/abi-armeabi-v7a/OpenCVConfig.cmake:129
OpenCV: Include directory doesn't exist:
'/Users/ohwada/AndroidStudioProjects/Opencv48/sdk/native/jni/include'.
# /sdk/native/ を /opencv/native/ に変更する
set(__OpenCV_INCLUDE_DIRS "${OpenCV_INSTALL_PATH}/sdk/native/jni/include")
CMake Error at /Users/ohwada/AndroidStudioProjects/Opencv48/opencv/native/jni/abi-armeabi-v7a/OpenCVModules.cmake:245 (message):
The imported target "libcpufeatures" references the file
"/Users/ohwada/AndroidStudioProjects/Opencv48/sdk/native/3rdparty/libs/armeabi-v7a/libcpufeatures.a"
but this file does not exist.
# /sdk/native/ を /opencv/native/ に変更する
set_target_properties(libcpufeatures PROPERTIES
IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/sdk/native/3rdparty/libs/armeabi-v7a/libcpufeatures.a"
)
list(APPEND _IMPORT_CHECK_FILES_FOR_libcpufeatures "${_IMPORT_PREFIX}/sdk/native/3rdparty/libs/armeabi-v7a/libcpufeatures.a" )
アプリを実行する
下記の3つが同封されていることが確認できる。
スクリーンショット
サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Opencv48