有关如何使用光流和goodFeaturesToTrack避免障碍的建议

时间:2019-07-06 11:45:19

标签: java android opencv

我正在使用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;
}

基本上,我的代码每帧都会引入新功能。

0 个答案:

没有答案