I am working on my semester project. I want to make exactly the same thing as in this video.
https://www.youtube.com/watch?v=_4hA36nXRjw&feature=youtu.be .
I want to make a obstacle detection application in Android using OpenCV. I am unable to calculate the optical flow (By using function Video.calcOpticalFlowPyrLK
) of the keypoints which I get from FeatureDetector Function. Further more I can't refine the points through RANSAC algorithm. I am in very much trouble. Kindly help me if anyone can. I shall be highly thankful to you.
public class MainActivity extends Activity implements 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;
}
}`