2014年02月25日

AndroidでOptical Flow

Screenshot_2014-02-25-10-19-58.png
OpenCv4AndroidにはcalcOpticalFlowPyrLKとcalcOpticalFlowFarnebackがありますが、今回は画面全域での動きを見たかったのでFarnebackを使いました。
画面解像度はonCreateの中で指定します。320*240で10fpsぐらい出ているようです。640*480ではほとんど使えないレベルです。
描画は20pxごとにFlowの線を描いていますが、実際にはすべての画素のFlowデータが計算されています。
下記のページなどを参考にしました。

・OpenCVで単純な画像処理(ネガポジ反転)

・Calculating optical flow in opencv android

ソースコードです。


package com.ir_lab.opencvtest;

import java.io.IOException;
import java.io.InputStream;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Point;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.highgui.Highgui;
import org.opencv.imgproc.Imgproc;
import org.opencv.video.Video;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.SurfaceView;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends Activity implements CvCameraViewListener2 {

private static final String TAG = "OCVSample::Activity";
private CameraBridgeViewBase mOpenCvCameraView;
private Mat mOutputFrame;

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
break;
default:
super.onManagerConnected(status);
break;
}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);

mOpenCvCameraView = (CameraBridgeViewBase)findViewById
(R.id.tutorial1_activity_java_surface_view);
mOpenCvCameraView.setMaxFrameSize(320, 240);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}

@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}

@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_8,
this, mLoaderCallback);
}

public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}

public void onCameraViewStarted(int width, int height) {
mOutputFrame = new Mat(height, width, CvType.CV_8UC4);
}

public void onCameraViewStopped() {
mOutputFrame.release();
}

Mat first_frame = null;
Mat second_frame = null;
public Mat onCameraFrame(final CvCameraViewFrame inputFrame) {

Point pt1=new Point();
Point pt2=new Point();
Scalar color;

first_frame = second_frame;
if(first_frame == null || second_frame == null){
first_frame = inputFrame.rgba();
second_frame = inputFrame.rgba();
return inputFrame.rgba();
}
second_frame = inputFrame.rgba();

Imgproc.cvtColor(first_frame, first_frame, Imgproc.COLOR_RGBA2GRAY);
Imgproc.cvtColor(second_frame, second_frame,Imgproc.COLOR_BGR2GRAY);

Mat flow = new Mat(second_frame.size(), CvType.CV_32FC2);
Video.calcOpticalFlowFarneback(first_frame, second_frame,
flow,0.5,3, 15, 3, 5, 1.1,0);

mOutputFrame = inputFrame.rgba();
for ( int i=0;i < second_frame.size().height;i+=20 ){
for ( int j=0;j < second_frame.size().width;j+=20 ){
pt1.x = j;
pt1.y = i;
pt2.x = j + flow.get(i,j)[0];
pt2.y = i + flow.get(i,j)[1];
color = new Scalar(255,255,0,255);
Core.line(mOutputFrame,
pt1,
pt2,
color, 2, 8, 0);
}
}
return mOutputFrame;
}
}


以上です。
posted by Tosh at 00:14| Comment(0) | スマートフォン
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: