我正在使用android中的实时避障应用程序。我正在使用opencv,并想到了用于对象跟踪的光流的想法。我仍然对android和opencv还是陌生的,而且我还没有完全了解光流的概念。因此,我的想法是使用calcOpticalFlowPyr()使用goodFeaturestoTrack来检测静态对象并检测运动对象。这是我有点困惑的地方。
我进行了稀疏的光学流动,并用一条线显示了上一个点和下一个点之间的运动。基本上这就是我要坚持的地方。
我在质疑我的代码是否真正正确(这可能是错误的)。我知道我每帧都会介绍新功能(这是正确的做法吗?)。由于我正在开发实时应用程序。
我还需要计算每个点的深度(特征),并找到与我(或相机)的距离。以及哪些点位于左侧,右侧或中央。我的想法是仅创建3个边界,并且这些边界内的任何点都位于中心(左侧或右侧)。但是对于实际距离估算,我读到光流会很有用,但由于缺乏对光流的理解以及我对android和opencv的新手技能的了解,因此对于实际实现我一无所知。
我非常感谢一些论文,文章,代码建议/实现。任何可以帮助教育我的东西。以及我真正需要的建设性批评。
我使用了Salil Kapur撰写的《掌握Opencv Android应用程序》一书,作为在android中实现光流的指南。但我发现它缺少。
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
mGray = inputFrame.rgba();
Mat mask = new Mat();
mGray.copyTo(mask); // to display rgb image
Size winSize = new Size(15,15);
TermCriteria term = new TermCriteria(TermCriteria.EPS | TermCriteria.MAX_ITER, 20,0.03);
Imgproc.cvtColor(mGray, mGray, Imgproc.COLOR_RGB2GRAY);
//Improve quality and corner detection
Imgproc.medianBlur(mGray,mGray,5);
//erode
Mat dilate = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3));
Imgproc.dilate(mGray,mGray,dilate);
//Detecting corners
Imgproc.goodFeaturesToTrack(mGray,features,100,0.05,
10,new Mat(),5,false,0.09);
prevFeatures.fromList(features.toList());
Imgproc.cornerSubPix(mGray, prevFeatures, winSize, new Size(-1,-1),term);
//OPTICAL FLOW
nextFeatures.fromArray(prevFeatures.toArray());
Video.calcOpticalFlowPyrLK(mPrevGray,mGray,prevFeatures,nextFeatures,status,err, winSize, 3, term, 0,0.001);
Imgproc.putText(mask,Integer.toString(features.toArray().length),new Point(20,50), Core.FONT_HERSHEY_SIMPLEX, 2, red);
Imgproc.putText(mask,Integer.toString(nextFeatures.toArray().length),new Point(20,100), Core.FONT_HERSHEY_SIMPLEX, 2, red);
// DRAWING MOTION VECTORS
List<Point> good_new = new ArrayList<>();
List<Point> good_old = new ArrayList<>();
for(int i = 0; i < prevFeatures.toArray().length;i++){
if(status.toList().get(i) == 1){
good_old.add(prevFeatures.toArray()[i]);
}
}
for(int i = 0; i < nextFeatures.toArray().length;i++){
if(status.toList().get(i) == 1){
good_new.add(nextFeatures.toArray()[i]);
}
}
for(int i = 0; i < good_new.size() || i < good_old.size();i++){
Point a = new Point(); Point b = new Point();
if(i < good_new.size()){
a.x = good_new.get(i).x;
a.y = good_new.get(i).y;
}
if(i < good_old.size()){
b.x = good_old.get(i).x;
b.y = good_old.get(i).y;
}
Imgproc.line(mask,a,b, blue, 2);
Imgproc.circle(mask,b, 5 , blue, -1);
}
nextFeatures.fromArray(prevFeatures.toArray());
mPrevGray = mGray.clone();
return mask;
}
基本上,我的代码每帧都会引入新功能。