Rectで切り取り範囲の頂点を変更できない。
オプティカルフローを使ったandroidアプリを作成しています。
画面全体のオプティカルフローを処理すると処理が重くなり、また誤認識も増えるため画像の一部を処理しようとRectを使っています。
Rect roi = new Rect(80,20,50,160);
切り取り範囲の頂点を(80,20)としてそこから160×50の部分を切り取ろうと設定してもアプリを起動すると原点(0.0)から160×50の範囲が切り取られています。頂点(80,20)の数値を別の数字に変えても反映されません。ちなみに切り取り範囲はきちんと反映されています。
原因がお分かりの方いらっしゃいましたら教えていただけますか?
package com.example.saito1.eyeglanceneo;
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.imgproc.Imgproc ;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.video.Video;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceView;
import android.view.WindowManager;
public class CameraActivity extends Activity implements CvCameraViewListener2 {
static {
if (!OpenCVLoader.initDebug()) {
Log.d("TAG", "Filed OpenCVLoader.initDebug()");
}
}
private static final String TAG = "OCVSample::Activity";
private CameraBridgeViewBase mOpenCvCameraView;// カメラビューのインスタンス
private Mat image; //カメラ画像保存用の画像行列
// OpenCVライブラリをロードした結果として呼ばれるコールバック
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
// 読み込みが成功したらカメラプレビューを開始
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG, "OpenCV loaded successfully");
//OpenCVを正しくロードできた場合はstatusとしてLoaderCallbackInterface.SUCCESSが渡されるので,
//その場合のみカメラプレビューを開始するようにしておきます。
mOpenCvCameraView.enableView();
break;
default:
super.onManagerConnected(status);
break;
}
}
};
// 起動時
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.eyeglance);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mOpenCvCameraView = (CameraBridgeViewBase)findViewById
(R.id.camera_view); // カメラビューのインスタンス(mOpenCvCameraView)を変数にバインド
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
// リスナーの登録*
mOpenCvCameraView.setCvCameraViewListener(this);// mOpenCvCameraViewが動いたら
mOpenCvCameraView.setMaxFrameSize(320,240);
}
// 停止時
@Override
public void onPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
// 再開時
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0,
this, mLoaderCallback);
//onResume時にOpenCVLoader#initAsyncを呼び出すことで,OpenCVライブラリをロードします。
//その際,第3引数にはロード処理終了時に呼び出されるコールバックを指定します。
}
// 破棄時
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
// カメラ開始時
public void onCameraViewStarted(int width, int height) { //カメラプレビュー開始時に呼ばれる
image = new Mat(height, width, CvType.CV_8UC4);
}
// カメラ停止時
public void onCameraViewStopped() {
image.release();
}
//時間計測用
double ff =1000000.0/System.nanoTime();
Mat first_frame = null;//1枚目の画像比較
Mat second_frame = null;//2枚目の画像比較
int Yhaba = 5;//水平の点の間隔
int Xhaba = 5;//垂直の点の間隔
Rect roi = new Rect(80,20,50,160);//切り取り範囲を指定
public Mat onCameraFrame(final CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
honban[0][0]=0.0;
honban[0][1]=0.0;
// コンストラクタ
Point pt1=new Point(); //二次元の座標を格納.
Point pt2=new Point();
Scalar color;
first_frame = second_frame;
if(first_frame == null || second_frame == null){ //開始時には0なので同じ画像が表示。
first_frame = new Mat(inputFrame.gray(),roi);//inputFrame.gray()でカメラ画像のMatを取得しfirst_frameに格納している
second_frame = new Mat(inputFrame.gray(),roi);
return inputFrame.gray();
}
second_frame = new Mat(inputFrame.gray(),roi);//セカンドが入る
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);
image = inputFrame.gray();
for ( int i=0;i < second_frame.size().height;i+=Yhaba ){//y
for ( int j=0;j < second_frame.size().width;j+=Xhaba ){//x
pt1.x = j;//元の点の場所
pt1.y = i;
pt2.x = j + flow.get(i,j)[0];//垂直[0]
pt2.y = i + flow.get(i,j)[1];//垂平[1]
color = new Scalar(255,255,0,255);
// フロー描画。imageに線描写をしている。
Imgproc.line(image,
pt1,
pt2,
color, 2, 8, 0);
}
}
return image;
} }