Segmentation Fault unbekannten Grund Opencv
Ich habe den folgenden code zusammengestellt, der in linux-terminal (c++ unter linux) und bin mit OpenCv 2.4.3.
Bin jedoch immer ein "segmentation fault" im Lauf der Zeit und ich habe wirklich keine Ahnung, warum. Ich habe platziert differnt cout Anweisungen um zu wissen, ob das Programm verarbeitet, insbesondere der Bühne, aber vergeblich. Könnten Sie mir bitte helfen? Bitte erklären Sie mir, was genau ist dieses "segmentation fault". Bin hier hängengeblieben, für eine lange Zeit.
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>
#include <stdlib.h>
using namespace cv;
using namespace std;
int main()
{
cout<<"check"<<flush;
Mat src,src_gray,dst;
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
char* window_name = "sharpness estimate";
int freq,rows,cols =0;
double *estimate,*min = 0;
Point *minLoc,*maxLoc = 0;
src = imread("/home/siddarth/examplescv/erez images/image53.jpg");
if( !src.data )
{
return -1;
}
namedWindow(window_name,CV_WINDOW_AUTOSIZE);
Mat abs_dst;
cvtColor(src,src_gray,CV_RGB2GRAY);
Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
convertScaleAbs(dst, abs_dst);
minMaxLoc(dst,min,estimate,minLoc,maxLoc,noArray());
Size s = dst.size();
rows = s.height;
cols = s.width;
cout<<rows<<endl<<cols<<endl;
for(int i=0;i<=rows;i++)
{
for(int j=0;j<=cols;j++)
{
if(dst.at<double>(i,j) >= *estimate-100
&& dst.at<double>(i,j) <= *estimate+100)
{
cout<<freq++;
}
}
}
cout<<"estimate :"<<*estimate<<endl;
cout<<"frequency :"<<freq<<endl;
imshow(window_name,abs_dst);
waitKey(1000);
return 0;
}
Den code nicht cross der erste "check" print-Anweisung nur nach der main-Funktion Erklärung. Das ist die verwirrende Frage. Aber sobald ich geleert, die erste print-Anweisung, habe es ausgeführt. Ich bin immer noch Probleme.
- Also, was habt Ihr
cout
s Ihnen sagen? Es gibt eine Menge fehlt hier. Wir brauchen mehr wissen darüber, Wann es Auftritt. - cout ist mir nichts. das ist die ganze Verwirrung. Die erste Prüfung ist auch nicht erreicht. Bitte helfen Sie mir.
- Wenn Sie fügen Sie ein "endl", um Ihre erste cout, ich Wette, dass man druckt, und es nicht ein paar Zeilen später. Versuchen Sie, mehr cout oder führen Sie den code in einem debugger. Es ist wahrscheinlich klar!
- Nur ein Hinweis für zukünftige Leser: die Spülung wäre nicht erforderlich, wenn cerr verwendet wurde, die in der Regel synchronisiert mit stdio.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellen Sie sicher, dass Sie einfügen
std::endl
incout
so, dass der Puffer geleert wird. Dies wird wohl der Grund sein, warum sind Sie nicht zu sehen, keine Ausgabe.Einem unmittelbaren Problem ist, dass Ihr
for
- Schleifen prüfen die Bedingung mit<=
, was bedeutet, dass Sie wahrscheinlich sind eine über das Ende. Aber da bist du mitat
haben, sollten Sie eine Ausnahme geworfen werden (vorausgesetzt, dieseMat
Typ verhält sich wie ein standard-container).Auch, die Sie erstellen, viel von Zeigern zu übergeben, als eine Funktion Argumente (zum Beispiel
double* estimate
). Das nicht tatsächlich geben Sie einedouble
Objekt allerdings nur einen Zeiger. Es sei denn, die Funktion, die Sie übergeben haben Sie ist die Zuteilung einerdouble
für Sie (was ich hoffe es nicht), dann machst du es falsch. Sollten Sie tun:Müssen Sie tun, dass mit all den Werten, die Sie bekommen, durch output-Parameter.
Andere Sache zu beachten: Tun
int i, j = 0;
nur initialisiertj
zu0
, aber nichti
. Sie tun müssenint i = 0, j = 0;
.Okay, ich werde erklären, warum die Fixierung des initialisers funktioniert. Ich musste nachschlagen die definition von minMaxLoc zu sehen, was passiert. Im Grunde genommen, die Funktion ist so etwas wie die folgenden:
Durch diese Funktion wird ein Zeiger auf ein
int
, und legen Sie dann dasint
auf den Wert5
. Allerdings, wenn der übergebene Zeiger ein null-Zeiger ist, wird der Wert nicht gesetzt werden (sonst werden Undefiniertes Verhalten, weil Sie derefencing ein null-Zeiger). Im Grunde, und übergeben Sie einen null-Zeiger sagt "I don' T care über diesem Wert, so geben Sie es nicht zu mir".Nun, wenn Sie waren Initialisierung von Zeigern, die Sie getan haben:
Diese legt nur
min
zu den null-Zeiger. Daestimate
linke ist nicht initialisiert, Sie können nicht Sie verlassen sich auf den Wert null. Sie müssen eine initialiser für jede Feststellung:<< std::flush
oder<< std::endl
Spülen, um den Ausgabepuffer. Dann geben Sie uns die Informationen, die Sie bekommen, dass.cout
s an verschiedenen stellen in Ihrem code, so dass Sie sicher, Spülen Sie Sie und Sie werden merken, welche Linie es ist, die bewirkt, dass Ihr segfault. Ich habe das Gefühl, meine Letzte Bearbeiten wird Ihnen helfen.double* estimate
(und andere)double estimate
?Dank @sftrabbit. Das problem war die Initialisierung. statt
War die Veränderung
dieser entfernt die "segmentation fault". Vielen Dank für deine Hilfe :).
Da Sie in einer Linux-Umgebung, die Sie verwenden können, valgrind, um genau herauszufinden, wo die segmentation fault passiert. Geben Sie einfach valgrind, bevor Sie den Namen des Programms, oder die Art, wie Sie Ihr Programm auszuführen. Zum Beispiel, wenn Sie führen Sie Ihr Programm mit dem folgenden Befehl:
Hallo -print
geben Sie den folgenden Befehl statt:
valgrind Hallo -print
Sehe ich Sie schon gelöst, aber dies kann hilfreich sein in der Zukunft!