我正在研究我的学期项目。我想和这个视频完全一样。
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;
}
}`