Android OpenCV FAST角点检测过滤

时间:2017-06-13 10:36:17

标签: android opencv

我正在尝试开发一个Android应用程序,它应该从相机分析帧并检测角落。

我的目标是检测当前的棋盘状态并向服务器提供数据。

我已在我的应用中实施了OpenCV,并尝试使用FAST角点检测。

这是我的代码中我分析当前相机框架的一部分:

 @Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {
    MatOfKeyPoint points = new MatOfKeyPoint();
    try {
        Mat mat = inputFrame.rgba();
        FeatureDetector fast = FeatureDetector.create(FeatureDetector.FAST);
        fast.detect(mat, points);


        Scalar redcolor = new Scalar(255, 0, 0);
        Mat mRgba = mat.clone();
        Imgproc.cvtColor(mat, mRgba, Imgproc.COLOR_RGBA2RGB, 4);

        Features2d.drawKeypoints(mRgba, points, mRgba, redcolor, 1);
        mat.release();
        return mRgba;
    }
    catch (Exception e)
    {
        return inputFrame.rgba();
    }
}

此代码有效。问题是我得到了太多的角落。我想知道一种实现阈值的方法。

在这个Doc中,它讨论的是" nonmaxsuppression"。

如果有人不知道答案但知道在哪里可以找到Android更新的文档,那就太棒了!

谢谢!

2 个答案:

答案 0 :(得分:1)

我知道有两种方法可以用来对关键点进行排序:

  1. 使用不同的阈值更新检测器的.xml / .yml文件。您可以找到有关如何执行此操作的参考here

  2. 您可以对 MatOfKeyPoint 的响应进行排序,并根据需要选择前100或200。您可以在java中使用以下命令:

  3. // Sort and select 500 best keypoints
    List<KeyPoint> listOfKeypoints = matrixOfKeypoints.toList();
    Collections.sort(listOfKeypoints, new Comparator<KeyPoint>() {
        @Override
        public int compare(KeyPoint kp1, KeyPoint kp2) {
            // Sort them in descending order, so the best response KPs will come first
            return (int) (kp2.response - kp1.response);
        }
    });
    List<KeyPoint> listOfBestKeypoints = listOfKeypoints.subList(0, 500);
    

答案 1 :(得分:0)

FeatureDetector类已弃用。现在,您可以使用FastFeatureDetector类,该类为创建者提供阈值和非最大压缩选项。示例:

public void detectFeatures(Mat img, MatOfKeyPoint fatures) {
    int threshold = 20;
    boolean nonMaxSup = true;
    FastFeatureDetector fast = FastFeatureDetector.create(threshold, nonMaxSup, FastFeatureDetector.TYPE_7_12);
    fast.detect(img, features);
}

请参阅文档here