カメラプレビューの表示
プロジェクトの作成
ここからはアプリの実装に進みます。まず、"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;
}
}
実行結果
ビルドして実行するとカメラプレビューが表示されます。基本的な処理が確認できたので、次は画像認識処理の実装に移ります。

