

オプティカルフローを使ったandroidアプリを作成しています。  
画面全体のオプティカルフローを処理すると処理が重くなり、また誤認識も増えるため画像の一部を処理しようとRectを使っています。

[code]

         Rect roi = new Rect(80,20,50,160);
    
[/code]

切り取り範囲の頂点を（80,20）としてそこから160×50の部分を切り取ろうと設定してもアプリを起動すると原点（0.0）から160×50の範囲が切り取られています。頂点（80,20）の数値を別の数字に変えても反映されません。ちなみに切り取り範囲はきちんと反映されています。

原因がお分かりの方いらっしゃいましたら教えていただけますか？

[code]

        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;  
      }   }
    
[/code]


CC BY-SA 3.0
2016-01-08T08:10:55.257
20744
2021-03-07T05:14:57.307
2021-03-07T05:14:57.307
3060
13431
question
java android opencv
Rectで切り取り範囲の頂点を変更できない。