2013-03-27 6 views
16

Ich schreibe Code, um ähnliche Objekte aus Drawable in Kamerapreview zu finden. Ich benutze das neueste Opencv 2.4.4.Matcher Assertions fehlgeschlagen Fehler opencv Android

Unten sind meine Funktionen und eine Ausgabe von logcat. Was mache ich falsch, dass ich eine solche Ausgabe bekomme?

public void detect_image (Mat mRgba) { 

    object_desc = new Mat(); 
    scene_desc = new Mat(); 

    object_keys = new MatOfKeyPoint(); 
    scene_keys = new MatOfKeyPoint(); 

    matches = new MatOfDMatch(); 
    good_matches = new MatOfDMatch(); 

    Bitmap image = BitmapFactory.decodeResource(getResources(), R.drawable.sto); 
    Utils.bitmapToMat(image,object); 

    surf = FeatureDetector.create(FeatureDetector.FAST); 
    surf.detect(object, object_keys); 
    surf.detect(mRgba, scene_keys); 
    surfEX = DescriptorExtractor.create(DescriptorExtractor.BRIEF); 
    surfEX.compute(object, object_keys, object_desc);  
    surfEX.compute(mRgba, scene_keys, scene_desc); 
    dm = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);  
    dm.match(object_desc, scene_desc, matches); 

    double max_dist = 0; 
    double min_dist = 100; 

    for(int i = 0; i < object_desc.rows(); i++) 
     { double dist = matches.toArray()[i].distance; 
     if(dist < min_dist) min_dist = dist; 
     if(dist > max_dist) max_dist = dist; 
     } 

    for(int i = 0; i < object_desc.rows(); i++) 
     { MatOfDMatch temp = new MatOfDMatch(); 
     if(matches.toArray()[i].distance < 3*min_dist) 
     { temp.fromArray(matches.toArray()[i]); 
      good_matches.push_back(temp); 
      }   
     } 

} 



public Mat onCameraFrame(CvCameraViewFrame inputFrame) {   
    mRgba = inputFrame.rgba(); 
      detect_image(mRgba); 
    return inputFrame.rgba(); 
} 

Logcat:

03-27 01:55:31.258: E/cv::error()(564): OpenCV Error: Assertion failed 
(type == src2.type() && src1.cols == src2.cols && 
(type == CV_32F || type == CV_8U)) in void cv::batchDistance(cv::InputArray, 
cv::InputArray, cv::OutputArray, int, cv::OutputArray, int, int, cv::InputArray, 
int, bool), file /home/reports/ci/slave/50-SDK/opencv/modules/core/src/stat.cpp, 
line 1803 
+0

Welche genau Linie auf dieser Behauptung versagt? Sind Sie sicher, dass 'surf.detect()' eine Bitmap als Eingabe akzeptieren kann? Sollte es nicht eine Matte sein? – JonesV

+0

surf.detect() nimmt Mats und Objekt und mRgba sind Mats. Die folgende Zeile verursacht die Probleme: dm.match (object_desc, scene_desc, Übereinstimmungen); – Martus0

+3

Mein Fehler, ich hatte 'Utils.bitmapToMat()' nicht gesehen. Haben Sie manuell überprüft, ob "object_desc.type == scene_desc.type" und "object_desc.cols == object_scene.cols"? Es gibt anscheinend eine Art Inkompatibilität zwischen deinem 'object_desc' und' scene_desc' ... – JonesV

Antwort

19

Nur um diese Frage der Schließung:

nach Ihrem Kommentar, die folgende Zeile wurde das Problem verursacht:

dm.match(object_desc, scene_desc, matches); 

I empfohlen, dass Sie dies manuell überprüfen:

(object_desc.type == scene_desc.type && 
object_desc.cols == object_scene.cols) 

Das Problem war schließlich, dass für den ersten Rahmen, object_desc.cols() != scene_desc.cols(). Ein einfaches if war genug, um das Problem zu lösen.

+0

Sie Sir, sind meine Helden. Es hat zwei Tage gedauert, um das herauszufinden! +1 –

+0

Open Cv Mat haben keine Typ Methode jetzt würdest du bitte diese Antwort aktualisieren – Crawler

+0

Hey @LiamGeorgeBetsworth .... kannst du mir bitte sagen wie hast du das gelöst, weil ich folgende Vorgehensweise benutze und Fehler immer noch da ist if (thisHisto.type() == toCompareHisto.type() && thisHisto.cols() == toCompareHisto.cols()) { matcher.match (thisHisto, toCompareHisto, Übereinstimmungen); } – AwaisMajeed

0

(Offene Cv Mat doestn't haben Typ-Methode) versuchen, diese Methode ..

public void match(Mat object_desc, Mat scene_desc, MatOfDMatch matches) 
{ 
    if(object_desc.type() == scene_desc.type() && 
      object_desc.cols() == scene_desc.cols()) {    
     match_1(nativeObj, object_desc.nativeObj, scene_desc.nativeObj, matches.nativeObj); 
    } 

} 
Verwandte Themen