2017-06-13 65 views
0

我想開發一個android應用程序,它應該分析從相機的幀和檢測角落。Android OpenCV FAST角落檢測過濾

我的目標是檢測當前的棋盤狀態並向服務器提供數據。

我在我的應用程序中實現了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

你可能只是全部排序根據[迴應]的關鍵點(http://docs.opencv.org/trunk/d2/ d29/classcv_1_1KeyPoint.html#a1f163ac418c281042e28895b20514360) –

+0

可以告訴我一些代碼嗎?我無法弄清楚如何得到這個「響應」參數 –

+0

剛剛添加了一個答案 –

回答

1

有兩種方法,我知道的,你可以用它來排序的關鍵點:

  1. 更新探測器用不同的閾值.xml/.yml文件。你可以找到關於如何做到這一點here

  2. 您可以排序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);

+0

如何將listOfKeypoints轉換爲「MatOfKeyPoints」傳遞給「Features2d.drawKeypoints」參數? (第二種方式) –

+0

http://docs.opencv.org/java/2.4.9/org/opencv/utils/Converters.html#vector_vector_KeyPoint_to_Mat(java.util.List,java.util.List) –

+0

感謝:D。 .... –