【发布时间】:2012-12-25 20:08:47
【问题描述】:
我在 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;
}
代码没有跨越主函数声明之后的第一个“检查”打印语句。这就是令人困惑的问题。但是一旦我刷新了第一个打印语句,它就被执行了。我仍然面临问题。
【问题讨论】:
-
那么您的
couts 告诉了您什么?这里缺少很多东西。我们真的需要更多地了解它何时发生。 -
cout 什么也没给我。这就是整个混乱。也未达到初始检查。请帮帮我。
-
如果你在你的第一个 cout 中添加一个“endl”,我敢打赌它会打印出来,但它会在几行之后失败。尝试添加更多 cout 或在调试器中运行您的代码。这很可能是显而易见的!
-
只是给未来读者的提示:如果使用通常与 stdio 同步的 cerr,则不需要 flushing .
标签: c++ linux opencv segmentation-fault