分割故障原因未知OPENCV



i在Linux终端中编译了以下代码(Linux中的C ),并使用OpenCV 2.4.3。

但是,在运行时间中会遇到细分故障,我真的不知道为什么。我提出了不同的cout语句,以知道该程序是否已处理到特定阶段,但徒劳无功。请你帮助我好吗?请向我说明这个细分错误到底是什么。

在这里呆了很长时间。
#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;   
 }

在主函数声明之后,代码不会越过第一个"检查"打印语句。那是令人困惑的问题。但是,一旦我冲洗了第一个打印语句,它就被执行了。我仍然面临问题。

确保将std::endl插入cout中,以使缓冲区被冲洗。这可能就是为什么您没有看到任何输出。

一个直接的问题是,您的for循环使用<=检查条件,这意味着您可能会超过一个末端。但是,由于您使用的是at,因此应该有一个例外(假设此Mat类型的作用像标准容器)。

另外,您正在创建许多指示器以作为某些函数参数传递(例如,double* estimate)。不过,这实际上并没有给您一个double对象,只是指针。除非您传递给它们的功能是为您分配double(我希望不是),否则您做错了。您应该这样做:

double estimate;
minMaxLoc(/* ... */, &estimate, /* ... */);

您需要使用您通过输出参数获得的所有值来做到这一点。

要注意的另一件事:仅执行int i, j = 0;初始化j0,而不是i。您需要做int i = 0, j = 0;


好吧,我要解释为什么修复初始评估器的作用。我必须查找Minmaxloc的定义,看看会发生什么。基本上,该功能如下:

void setToFive(int* x)
{
  if (x) {
    *x = 5;
  }
}

此功能将将指针用于int,然后将int设置为值5。但是,如果指针传递是一个空指针,则将无法设置该值(否则,由于您正在放弃零指针,因此会有不确定的行为)。基本上,通过无效指针说:"我不在乎这个价值,所以不要把它交给我。

现在,当您初始指针时,您正在这样做:

double *estimate, *min = 0;

这仅将min设置为空指针。由于estimate是非初始化的,因此您不能依赖其值为null。您需要为每个声明器提供一个初始评估器:

double *estimate = 0, *min = 0;

感谢@sftrabbit。问题是初始化。而不是

    int freq,rows,cols=0;

更改是

    int freq=0,rows=0,cols=0; 

这消除了分割故障。非常感谢您的帮助:)。

由于您在Linux环境中,因此可以使用Valgrind来确切找出分割故障发生的位置。只需在程序的名称之前键入Valgrind,或者您执行程序的方式。例如,如果您使用以下命令执行程序:

你好-print

而是发出以下命令:

valgrind Hello -print

我看到您已经解决了这个问题,但是这在将来可能会有所帮助!

相关内容

  • 没有找到相关文章

最新更新