基于智能手机的障碍物检测,适用于使用Opencv4Android的视障人士

时间:2016-06-28 03:03:21

标签: android opencv opencv4android opticalflow

我正在研究我的学期项目。我想和这个视频完全一样。   https://www.youtube.com/watch?v=_4hA36nXRjw&feature=youtu.be。 我想使用OpenCV在Android中制作障碍物检测应用程序。我无法计算从 FeatureDetector 函数获得的关键点的光流(通过使用函数Video.calcOpticalFlowPyrLK)。此外,我无法通过RANSAC算法细化点。我很麻烦。如果有人可以,请帮助我。我将非常感谢你。

公共类MainActivity扩展Activity实现CvCameraViewListener2 {

private static final String    TAG = "ziadkhan.optical_flow";

public static final int        VIEW_MODE_KLT_TRACKER=0;
public static final int        VIEW_MODE_OPTICAL_FLOW=1;

private int                    mViewMode;
private Mat                    mRgba;
private Mat                    mGray;
private Mat                    mIntermediateMat;
private Mat                    mPrevGray;
private CameraBridgeViewBase   mOpenCvCameraView;

MatOfPoint2f                   prevFeatures, nextFeatures;
MatOfPoint                     features;
private MatOfByte              status;
private MatOfFloat             err;
private MenuItem               mItemPreviewOpticalFlow, mItemPreviewKLT;

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);
            }
        }
    }
};
//private JavaCameraView mOpenCvCameraView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    setContentView(R.layout.activity_main);

    mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.main_activity_surface_view);
    mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
    mOpenCvCameraView.setCvCameraViewListener(this);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
   // getMenuInflater().inflate(R.menu.menu_main, menu);
    mItemPreviewKLT = menu.add("KLT Tracker");
    mItemPreviewOpticalFlow = menu.add("Optical Flow");
    return true;
}

public void onResume() {
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item == mItemPreviewOpticalFlow) {
        mViewMode = VIEW_MODE_OPTICAL_FLOW;
        resetVars();
    }
    else if (item == mItemPreviewKLT){
        mViewMode = VIEW_MODE_KLT_TRACKER;
        resetVars();
    }

    return true;
}

private void resetVars() {
    mPrevGray = new Mat (mGray.rows(), mGray.cols(), CvType.CV_8UC1);
    features = new MatOfPoint();
    prevFeatures = new MatOfPoint2f();
    nextFeatures = new MatOfPoint2f();
    status = new MatOfByte();
    err = new MatOfFloat();
}

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

@Override
public void onCameraViewStarted(int width, int height) {
    mRgba = new Mat(height, width, CvType.CV_8SC4);
    mIntermediateMat = new Mat(height, width, CvType.CV_8SC4);
    mGray = new Mat(height, width, CvType.CV_8SC1);
    resetVars();
}

@Override
public void onCameraViewStopped() {
    mRgba.release();
    mGray.release();
    mIntermediateMat.release();
}

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    mGray = inputFrame.gray();
    final int viewmode = mViewMode;
    switch (viewmode) {
        case VIEW_MODE_OPTICAL_FLOW:

            if (features.toArray().length == 0) {
                int rowStep = 50, colStep = 100;
                int nRows = mGray.rows()/rowStep, nCols = mGray.cols()/colStep;

                Point points[] = new Point[nRows * nCols];
                for (int i = 0; i < nRows; i++) {
                    for (int j = 0; j < nCols; j++) {
                        points[i * nCols + j] = new Point(j * colStep, i * rowStep);
                    }
                }
                features.fromArray(points);
                prevFeatures.fromList(features.toList());
                mPrevGray = mGray.clone();
                break;
            }
            nextFeatures.fromArray(prevFeatures.toArray());
            Video.calcOpticalFlowPyrLK(mPrevGray, mGray, prevFeatures, nextFeatures, status, err);
            List<Point> prevList = features.toList(),
                    nextList = nextFeatures.toList();
            Scalar color = new Scalar(255);
            for (int i = 0; i < prevList.size(); i++) {
                Imgproc.line(mGray, prevList.get(i), nextList.get(i), color);
            }
            mPrevGray = mGray.clone();
            break;
        default:
            mViewMode = VIEW_MODE_OPTICAL_FLOW;
            break;
     }
    return mGray;
    }
}`

0 个答案:

没有答案