2017-06-13 5 views
0

Ich versuche, eine Android-App zu entwickeln, die die Bilder von der Kamera analysieren und Ecken erkennen sollte.Android OpenCV FAST Ecke Erkennung Filterung

Mein Ziel ist es, den aktuellen Schachbrettzustand zu erkennen und Daten an einen Server zu liefern.

Ich habe OpenCV in meiner App implementiert und ich versuche FAST Eckenerkennung zu verwenden.

Dies ist der Teil meines Codes, wo ich die aktuelle Kamerarahmen analysieren:

@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(); 
    } 
} 

Dieser Code funktioniert. Das Problem ist, dass ich zu viele Ecken bekomme. Ich würde gerne wissen, wie man einen Schwellenwert implementiert.

In diesem Doc spricht es über eine "nonmaxsuppression".

Wenn jemand keine Antwort weiß aber weiß, wo Android aktualisierte Dokumentation zu finden ist, wird es großartig!

Danke!

+0

Sie könnten einfach irgendwie alle keypoints je nach [Antwort] (http://docs.opencv.org/trunk/d2/ d29/classcv_1_1KeyPoint.html # a1f163ac418c281042e28895b20514360) –

+0

Kannst du mir Code zeigen? Ich kann nicht herausfinden, wie man diesen "Antwort" -Parameter bekommt –

+0

Nur eine Antwort hinzugefügt –

Antwort

1

Es gibt zwei Möglichkeiten, wie ich weiß, von denen man die Eigenpunkte sortieren verwenden können:

  1. Aktualisieren der .xml/.yml Datei des Detektors mit einem anderen Schwellenwert. Sie können Verweis auf finden, wie man das here

  2. Sie die Antwort des MatOfKeyPoint sortieren und wählen Sie den ersten 100 oder 200, wie Sie wollen. Sie können die folgenden verwenden, so in Java zu tun:

    // 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

Wie kann ich listOfKeypoints in "MatOfKeyPoints" umwandeln, um zum "Features2d.drawKeypoints" -Parameter überzugehen? (zweite Möglichkeit) –

+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

Danke: D. .... –