SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所

Google Glassでの画像認識アプリケーションの開発

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所 第18回

カメラプレビューの表示

プロジェクトの作成

 ここからはアプリの実装に進みます。まず、"ORBDetection"という名前でAndroidアプリケーションプロジェクトを新規作成します。作成したプロジェクトのコンテキストメニューを開き、プロパティー→Androidと選択して先ほどWorkspaceにインポートしたOpenCVライブラリをプロジェクトに紐付けます。

OpenCVの静的ライブラリの生成

 ndk-buildツールにより、OpenCVのライブラリを作ります。プロジェクトのルートディレクトリにjniフォルダを作成し、さらにその下にAndroid.mk、およびApplication.mkという名前のファイルを作成します。

Android.mk

 9行目のincludeはOpenCVライブラリが配置されているパスを指すようにします。

LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
# OpenCV
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
 
include ../../sdk/native/jni/OpenCV.mk

Application.mk

 Application.mkではアプリケーションの実行環境やCPUアーキテクチャなど、ビルドに関する設定情報を記述します。

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a
APP_PLATFORM := android-19

ndk-buildの実行

 ターミナルでプロジェクトのルートディレクトリに移動し、ndk-buildを実行します。これによりライブラリが静的ビルドされてライブラリファイル(*.so)がプロジェクト内に生成されます。

$ cd <project root directory>
$ ndk-build

 このあたりの内容は公式サイトのチュートリアルが参考になります。WindowsやLinux環境の方はこちらをご参照ください。本文は英語になりますが、Windows環境のスクリーンショットもあるので英語に苦手意識がある方でも気合でなんとかなると思います。

Androidアプリケーションの実装

ORBDetection.java

 ここからはAndroidアプリケーションを実装していきます。OpenCVライブラリをプログラム内で利用するにはロードする必要がありますが、この処理はアプリ実行時に一度だけすればよいのでandroid.app.Applicationを継承したカスタムクラスで実装します。

public class ORBDetection extends Application {
    static {
        // アプリ起動時に一度だけOpenCVLibraryを読み込む
        if (!OpenCVLoader.initDebug()) {
        // エラーが発生した場合、ここで処理する
        } else {
        // 追加で読み込むJNIライブラリがあればここでロードする
        }
    }
}

activity_camera.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:opencv="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
 
    <org.opencv.android.JavaCameraView
        android:id="@+id/camera_view"
        android:layout_width="@dimen/view_width"
        android:layout_height="@dimen/view_height"
        android:layout_centerInParent="true"
        opencv:show_fps="true"  />
 
</RelativeLayout>

CameraActivity.java

 CvCameraViewListener2インターフェースのメソッドを実装することで、OpenCVの基本クラスMat型としてカメラから入力された画像をプログラムの中で扱うことができるようになります。51~56行目では入力された画像をRGBA形式に変換して返しているのみですが、ここでOpenCVのライブラリを利用して画像処理を行うことができます。端末のカメラ機能を使うためには、org.opencv.android.JavaCameraViewクラスを利用します。

public class CameraActivity extends Activity implements CvCameraViewListener2{
    private int mWidth, mHeight;
    private JavaCameraView mCamera;
    Mat mRgba;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        setContentView(R.layout.activity_camera);

        // 画面サイズを定義ファイルから取得
        mWidth = getResources().getDimensionPixelSize(R.dimen.view_width);
        mHeight = getResources().getDimensionPixelSize(R.dimen.view_height);

        // カメラの初期設定
        mCamera = (JavaCameraView) findViewById(R.id.camera_view);
        mCamera.setCameraIndex(CameraBridgeViewBase.CAMERA_ID_ANY);
        mCamera.setCvCameraViewListener(this);
        mCamera.setMaxFrameSize(mWidth, mHeight);
    }

    @Override
    protected void onResume(){
        super.onResume();
        mCamera.enableView();    // カメラをONにする
    }

    @Override
    protected void onStop(){
        super.onStop();
        if(mCamera != null)
            mCamera.disableView();
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        if(mCamera != null)
            mCamera.disableView();
    }

    // 以下はCvCameraViewListener2インターフェースの実装
    @Override
    public void onCameraViewStarted(int width, int height) {}

    @Override
    public void onCameraViewStopped() {}

    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        Mat frame = inputFrame.rgba();
        return frame;
    }
}

実行結果

 ビルドして実行するとカメラプレビューが表示されます。基本的な処理が確認できたので、次は画像認識処理の実装に移ります。

次のページ
画像認識の基礎 ~特徴とは~

この記事は参考になりましたか?

近未来の技術トレンドを先取り! 「Tech-Sketch」出張所連載記事一覧

もっと読む

この記事の著者

飯田 勝也(TIS株式会社)(イイダ カツヤ)

TIS株式会社 エンタープライズソリューション推進部所属。2012年入社後、ERPの保守・追加機能開発の業務を経て、現在はエンタープライズモバイルの分野でMobile Platformを活用したiOS、Androidのアプリ開発およびコンサルティング業務に携わっています。 新しいもの好きな性格で、い...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8454 2015/02/23 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー