2012-12-26 106 views
0

昨天我有一个类似的问题,并能够推断出错误,感谢您的帮助。那么今天我遇到了一个非常类似的问题,但是,就我的最佳水平而言,我仍然无法找到这个特定代码中分段错误的原因。OpenCV minMaxLoc函数中的分段错误

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; 
    } 

我能够在运行时进行,直到CHECK2。我的猜测是分段错误是由于minMaxLoc引起的。请帮我解决这个问题。如果您能告诉我如何解决未来的分段故障以及为什么发生分段故障,我也会非常高兴。它实际上意味着什么?

注意:getDir函数是由我自己编写的,而不是内置的。它只是给出了给定目录中的目录和文件列表。在linux Ubuntu的11.10和OpenCv2.4.3调试器的

输出

上午执行的OpenCV:

“程序接收信号SIGSEGV,分割故障0x001b7c5c在 CV :: minMaxIdx(栽培品种: :_InputArray常量&,双*双*,诠释*,诠释*, CV :: _ InputArray常量&)()从 /usr/local/lib/libopencv_core.so.2.4"

+1

为什么你没有尝试使用调试器? –

+0

我用gdb来调试我的代码。请检查调试器输出的编辑。据我猜测,这是与minMaxLoc函数。 –

回答

0

错误在于minMaxLoc的用法,作为#Castilho的指针。以下更改帮助我解决了分段错误。

double estimation,min; 
    Point minLoc,maxLoc; 
    . 
    . 
    . 
    . 
    minMaxLoc(dst,&min,&estimation,&minLoc,&maxLoc,noArray()); 
    cout<<"estimate :"<<estimate<<endl; 

谢谢你的帮助:)。

3

看着你的代码,没有调试它,我猜问题是dst,它还没有被初始化。

在尝试使用它之前,您必须为矩阵分配内存。

Check this link to the OpenCv documentation,但对如何使用minMaxLoc()一个非常很好的例子。要特别注意那里的第7项。

但是,正如评论中所述,学习使用调试器,在运行时检查所有变量,检查是否存在应该有值的NULL,这是一件好事。调试器是程序员最好的朋友;)

我在那看到的另一个问题是estimation,它是NULL,并且您试图在minMaxLoc的调用之后立即取消引用它。从我记得的这个函数中,它不会改变估计值,但我可能是错的。

+0

非常感谢您的帮助。将看看这个例子。并取消引用它确实有效,因为我有另一个类似的代码,我昨天喜欢,它在那里工作:)。 –

+0

谢谢。错误在于minMaxLoc的使用。我初始化了double而不是指针并且通过了地址。工作顺利。 –