LoginSignup
2
1

More than 3 years have passed since last update.

Android で OpenCV のサンプル mixedprocessing を試す

Last updated at Posted at 2019-11-30

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 にリネームする。

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 にリネームする。
プロジェクトのファイル構成に合わせて変更する。

jni_part.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を変更する

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'.

OpenCVConfig.cmake
# /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.

OpenCVModules-release.cmake
# /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つが同封されていることが確認できる。
- libopencv_java4.so
- libc++_shared.so
- libmixed_sample.so
opencv48_analyze_apk.png

アプリが起動すると、
カメラのアクセス許可を要求する。
opencv48_permission.png

スクリーンショット

Preview RGBA (カラー)
opencv48_rgba.png

Preview Gray (グレースケール)
opencv48_gray.png

Canny(エッジを検出)
opencv48_canny.png

Find feature(特徴点検出)
opencv48_find._featurepng.png

  

サンプルコードをgithub に公開した。
https://github.com/ohwada/Android_Samples/tree/master/Opencv48

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1