2017-05-09 3 views
0

Ich verwende eine Funktion wie folgt;Findcontours() Laufzeitfehler

Mat large = imread(path+name); 
Mat rgb; 
if (large.rows > 2500 || large.cols > 1250) 
{ 
    pyrDown(large, rgb); 
} 
else 
{ 
    rgb = large.clone(); 
} 
cv::Mat smallx; 
cvtColor(rgb, smallx, CV_BGR2GRAY); 
Mat grad,connected,bw; 

Mat morphKernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
cv::morphologyEx(smallx, grad, MORPH_GRADIENT, morphKernel); 
cv::threshold(grad, bw, 100, 255, THRESH_BINARY + THRESH_OTSU); 
morphKernel = getStructuringElement(MORPH_RECT, Size(9, 1)); 
cv::morphologyEx(bw, connected, MORPH_CLOSE, morphKernel); 

Mat mask = Mat::zeros(bw.size(), CV_8UC1); 
vector<vector<Point>> contours; 
vector<Vec4i> hierarchy; 

cv::findContours(connected, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

Einige Eingabebilder prompt Ausnahme, wenn die Funktion zurückkehrt, ist es mir wirft auf "_Mybase :: ausplanen (_Ptr, _count);" Codeblock in der Klasse xmemory0. Ich muss diese Art von Fehlern abfangen und diesen Prozess vor unerwarteten Unterbrechungen schützen.

-------------- FEHLERDETAILS --------------

Ich versuchte diesen Codeblock mit 30 verschiedenen Eingaben, aber es gab Fehler in ein paar Bildern. Nach findcontours habe ich eine Ausnahmepause ausgelöst und zeige mir diese Nachricht.

Unbehandelte Ausnahme bei 0x74477fb2 (ucrtbase.dll) in ImageRecognizer.exe: 0xc0000409: 0xc0000409.

in dieser Zeit, "Vektor" -Klasse in meinem Visual Studio mit diesen Zeilen öffnen;

~vector() _NOEXCEPT 
    { // destroy the object 
    _Tidy(); 
    } 

oder Klasse "xmemory" mit diesen Zeilen öffnen;

void deallocate(pointer _Ptr, size_type _Count) 
    { // deallocate object at _Ptr, ignore size 
    _Mybase::deallocate(_Ptr, _Count); 
    } 

Antwort

1

Es scheint, dass Anzahl der Zähler Ihre Methode Versuchen überschreitet 50000. findet nicht magischen Zahlen zu verwenden. Es ist immer eine schlechte Übung.

+0

gut, ich habe versucht, Vektoren ohne 50000 zu initialisieren, aber in dieser Zeit bekomme ich denselben Fehler für mehr Eingaben. Jedenfalls weiß ich, dass es keine sinnvolle Lösung ist, aber ich muss diesen Fehler komplett lösen. –

+0

versuchen, ohne Punkt (0,0) und versuchen, diese überladene Methode Leere cv :: findContours (InputOutputArray \t Bild, OutputArrayOfArrays \t Konturen, int mode, int Methode, Punkt offset = Point()) – hagor

+0

ich kann versuchen zu laufen, ohne Punkt, aber ich brauche Hierarchie. Ich kenne diese Methodenoption bereits, aber sie ist für meinen Fall nicht nützlich. Aber ich werde ohne Punkt (0,0) testen. –

0

Ich habe versucht, OpenCV 2.4.13 anstelle von OpenCV 2.4.12 und Problem von selbst gelöst. Es war kein Algorithmus oder logischer Fehler. Es war ein Bibliotheksfehler.