我正在尝试开发一个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更新的文档,那就太棒了!
谢谢!
答案 0 :(得分:1)
我知道有两种方法可以用来对关键点进行排序:
使用不同的阈值更新检测器的.xml
/ .yml
文件。您可以找到有关如何执行此操作的参考here
您可以对 MatOfKeyPoint 的响应进行排序,并根据需要选择前100或200。您可以在java中使用以下命令:
// 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