2016-09-29 2 views
0

Ich versuche, einen Deskriptor mit FAST für die Punkt Erkennung und SIFT für den Aufbau des Descriptor zu erstellen. Zu diesem Zweck benutze ich OpenCV. Während ich OpenCVs FAST verwende, verwende ich nur Teile des SIFT-Codes, weil ich nur den Descriptor brauche. Jetzt habe ich einen wirklich gemeinen malloc Fehler und ich weiß nicht, wie man es löst. Ich habe meinen Code in GitHub geschrieben, weil es groß ist und ich nicht wirklich weiß, wo der Fehler herkommt. Ich weiß nur, dass es am Ende der DO-while-Schleife erstellt:Malloc Fehler: OpenCV/C++ während push_back Vector

features2d.push_back(features); 
    features.clear(); 
    candidates2d.push_back(candidates); 
    candidates.clear(); 
    } 
}while(candidates.size() > 100); 

Wie Sie im Code von GitHub sehen können ich bereits versucht, Speicher der Anwendung freizugeben. Xcode Analysis sagt, dass meine Anwendung 9 MB Speicher verwendet. Ich habe versucht, den Fehler zu debuggen, aber es war sehr kompliziert und ich habe keine Ahnung gefunden, wo der Fehler herkommt.

EDIT ich, wenn diese Fehler gewundert auftreten können, weil ich versuche, das Bild Pixel Wert auf calcOrientationHist geben zuzugreifen (...) mit img.at<sift_wt>(...) wo typdef float sift_wt bei Line 56 und 57 in meinem Code, weil normalerweise Patch Ich gebe die Ausgänge 0, was bedeutet, es ist ein CV_8UC1 Aber nun, ich kopierte diesen Teil aus der sift.cpp at Line 330 and 331 Normalerweise sollte der SIFT Descriptor auch ein Graustufenbild haben oder nicht?

EDIT2 Nach dem Ändern des Typs in der img.at<sift_wt>(...) Position nichts geändert. Also googelte ich Lösungen und landete bei der GuardMalloc-Funktion von XCode. Das Aktivieren hat mir einen neuen Fehler gezeigt, der wahrscheinlich der Grund ist, dass ich den Malloc Error bekomme. In Zeile 77 of my Code. Der Fehler es mir an dieser Linie gibt, ist EXC_BAD_ACCESS (Code=1, address=....) Es gibt die folgenden Zeilen:

for(k = 0; k < len; k ++){ 
    int bin = cvRound((n/360.f)+Ori[k]); 
    if(bin >= n) 
     bin -=n; 
    if(bin < 0) 
     bin +=n; 
    temphist[bin] += W[k]*Mag[k]; 
} 

Die Werte der genannten Variablen sind die folgenden: bin = 52, len = 169, n = 36, k = 0,W, Mag, Ori and temphist sind nicht dargestellt.

Hier der GuadMalloc Output (sorry, aber ich verstehe nicht wirklich, was genau es will)

GuardMalloc[Test-1935]: Allocations will be placed on 16 byte boundaries. 
GuardMalloc[Test-1935]: - Some buffer overruns may not be noticed. 
GuardMalloc[Test-1935]: - Applications using vector instructions (e.g., SSE) should work. 
GuardMalloc[Test-1935]: version 108 
Test(1935,0x102524000) malloc: protecting edges 
Test(1935,0x102524000) malloc: enabling scribbling to detect mods to free blocks 

Antwort

0

Antwort ist einfacher als Gedanke ... Das Problem war, dass bei der Berechnung der Bin in der For- Schleife der falsche Wert kam heraus. Anstatt ori[k] hinzuzufügen, sollte es eine Multiplikation mit ori[k] sein. Der Fehler führte es in einem Bin-Wert von 52, aber der Länge des Array, dass temphist 38.

Für alle, die ähnlichen Fehler müssen ist, zeigt ich recomment verwenden GuardMalloc oder Valgrind wirklich Malloc Fehler zu debuggen.

Verwandte Themen