我昨天遇到了类似的问题,并且能够在你的帮助下推断出错误。好吧,今天我遇到了一个非常类似的问题,但是,在我的水平最好的情况下,我仍然无法在这个特定的代码中找到分段错误的原因。
int main()
{
Mat src,dst,src_gray;
int kernel_size = 3;
int scale = 1;
int delta = 0;
int ddepth = CV_16S;
char* window_name = "sharpness estimate";
string dir = string("erez images");
vector<string> files = vector<string>();
getdir(dir,files);
cout<<files.size()<<endl;
int c;
double *estimate=0,*min=0;
Point *minLoc=0,*maxLoc=0;
string parent = "/home/siddarth/examplescv/erez images/";
for(int i=1; i<=files.size()-2;i++)
{
cout<<files.data()[i]<<endl<<i<<endl;
string path = parent+files.data()[i];
cout<<path<<endl;
src = imread(path);
if( !src.data )
{
return -1;
}
cout<<"check1"<<endl;
cvtColor(src,src_gray,CV_RGB2GRAY);
Laplacian(src_gray,dst,ddepth,kernel_size,scale,delta,BORDER_DEFAULT);
//convertScaleAbs(dst,abs_dst);
cout<<"check2"<<endl;
minMaxLoc(dst,min,estimate,minLoc,maxLoc,noArray());
cout<<"estimate :"<<*estimate<<endl;
}
waitKey(100000000000);
return 0;
}
在运行期间能够继续检查2。我的猜测是由于minMaxLoc引起的分段错误。请帮我解决这个问题。如果你能告诉我将来如何解决分段错误以及为什么会发生分段错误,我也会很高兴。它究竟意味着什么?
注意:getDir函数由我自己编写,而不是内置。它只是给出了给定目录中的目录和文件列表。
在linux中执行opencv Ubuntu 11.10和OpenCv2.4.3
调试器的输出:
“编程接收信号SIGSEGV,分段故障.0x001b7c5c in cv :: minMaxIdx(cv :: _ InputArray const&amp;,double *,double *,int *,int *, cv :: _ InputArray const&amp;)()来自 /usr/local/lib/libopencv_core.so.2.4"
答案 0 :(得分:3)
查看代码,不进行调试,我猜测问题是dst
,尚未初始化。
在尝试使用矩阵之前,必须为矩阵分配内存。
Check this link to the OpenCv documentation,它有一个关于如何使用minMaxLoc()
的非常良好示例。特别注意那里的项目。
但是,正如评论中所述,学习使用调试器,在运行时检查所有变量,检查是否存在应该具有值的NULL,这是一件好事。调试器是程序员最好的朋友;)
我看到的另一个问题是estimation
,它是NULL,你试图在调用minMaxLoc
之后取消引用它。从我记得的这个功能来看,它并没有改变估计的价值,但我可能是错的。
答案 1 :(得分:0)
错误在于使用minMaxLoc,因为#Castilho指出了。以下更改帮助我解决了分段错误。
double estimation,min;
Point minLoc,maxLoc;
.
.
.
.
minMaxLoc(dst,&min,&estimation,&minLoc,&maxLoc,noArray());
cout<<"estimate :"<<estimate<<endl;
感谢您的帮助:)。