Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;分段故障OpenCV_C++_Opencv_Segmentation Fault - Fatal编程技术网

C++ C++;分段故障OpenCV

C++ C++;分段故障OpenCV,c++,opencv,segmentation-fault,C++,Opencv,Segmentation Fault,下面代码中的想法是让一堆“漫游者”对象在画布上慢慢“绘制”图像。问题是,这段代码似乎只处理方形图像(在代码中,方形图像被标识为“隐藏”(因为它是由“画家”揭幕的),并从名为“unconvertest.png”的文件中加载),而不是矩形图像,这对我来说很神秘。当我尝试处理除正方形以外的任何东西时,会出现分割错误。据我所知,当我进入循环迭代类型为Agent的向量时(在(vector::iterator iter=agents.begin();iter!=agents.end();++iter)的行出

下面代码中的想法是让一堆“漫游者”对象在画布上慢慢“绘制”图像。问题是,这段代码似乎只处理方形图像(在代码中,方形图像被标识为“隐藏”(因为它是由“画家”揭幕的),并从名为“unconvertest.png”的文件中加载),而不是矩形图像,这对我来说很神秘。当我尝试处理除正方形以外的任何东西时,会出现分割错误。据我所知,当我进入循环迭代类型为Agent的向量时(在(vector::iterator iter=agents.begin();iter!=agents.end();++iter)的行
出现分段错误

#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
//#定义窗口大小为500
#定义步长为10.0
#定义NUM_代理100
/********************/
/*代理类定义和类原型*/
/********************/
类代理{
公众:
Agent();
int*GetLocation(void);
无效移动(无效);
空洞绘制(Mat图像);
int*GetSize(void);
私人:
双单兰德(无效);
int*位置;
int*GetReveal(无效);
垫藏;
};
int*Agent::GetSize(void){
整数*大小=新整数[2];
大小[0]=hidden.cols;
大小[1]=隐藏的行数;
返回(大小);
}
int*代理::GetReveal(void){
int*BGR=新int[3];
location=GetLocation();
对于(int i=0;i<3;i++){
BGR[i]=隐藏的.data[hidden.step[0]*位置[0]+隐藏的.step[1]*位置[1]+i];
}
返回(BGR);
}
无效代理::绘制(Mat图像){
int*location=GetLocation();
int*color=GetReveal();
对于(int i=0;i<3;i++){
image.data[image.step[0]*位置[0]+图像.step[1]*位置[1]+i]=颜色[i];
}
}
作废代理::移动(作废){
int dx=(int)(步长*UnifRand()-步长/2);
int dy=(int)(步长*UnifRand()-步长/2);
位置[0]+=((位置[0]+dx>=0)和(位置[0]+dx=0)和(位置[1]+dy//cout我不完全理解您的代码,但根据您最后的评论,“画布的步进”,我想我可以看到您有几种情况,您可能试图访问“隐藏”垫和“图像”垫中超出范围的数据

恐怕我只能提出建议

void Agent::Draw(Mat image) {
  int * location = GetLocation();
  int * color = GetReveal();
  for (int i = 0;i < 3;i++) {
    image.data[image.step[0]*location[0] + image.step[1]*location[1] + i] = color[i];
  }
}
void代理::绘制(Mat图像){
int*location=GetLocation();
int*color=GetReveal();
对于(int i=0;i<3;i++){
image.data[image.step[0]*位置[0]+图像.step[1]*位置[1]+i]=颜色[i];
}
}
这里是访问GetLocation的实例,它是在构建代理过程中从一个随机数乘以隐藏垫的大小得到的。我担心在访问image.data矩阵时,这里会出现“索引超出边界”类型的错误。因此,这可能是要检查的第一件事

像智者一样

int * Agent::GetReveal(void) {
  int * BGR = new int[3];
  location = GetLocation();
  for (int i = 0; i < 3; i++) {
    BGR[i] = hidden.data[hidden.step[0]*location[0] + hidden.step[1]*location[1] + i];
  }
  return (BGR);
}
int*代理::GetReveal(void){
int*BGR=新int[3];
location=GetLocation();
对于(int i=0;i<3;i++){
BGR[i]=隐藏的.data[hidden.step[0]*位置[0]+隐藏的.step[1]*位置[1]+i];
}
返回(BGR);
}
您正在使用getLocation(),它将返回一个远大于隐藏图像大小的点。因此,我很确定您在这里也会遇到错误。位置应该从hidden.cols()和hidden.rows()派生

我只是粗略地看了一眼,但我肯定会在getLocation()返回的值周围做一些检查,以及是否可以从mat矩阵访问这样的值

此外,虽然我不完全确定,因为我认为您可以用两种不同的方式使用位置,但如果位置是绘图(图像)中的某个点,则需要调整以下内容:

location[0] += (((location[0] + dx >= 0) & (location[0] + dx < hidden.cols)) ? dx : 0);
location[1] += (((location[1] + dy >= 0) & (location[1] + dy < hidden.rows)) ? dy : 0);
位置[0]+=((位置[0]+dx>=0)和(位置[0]+dx=0)和(位置[1]+dy
考虑到隐藏图像的宽度,比如

location[0] += (((location[0] + dx >= 0) & (location[0] + dx + hidden.cols < maxWidth)) ? dx : 0);
location[1] += (((location[1] + dy >= 0) & (location[1] + dy + hidden.rows < maxHeight)) ? dy : 0);
位置[0]+=((位置[0]+dx>=0)和(位置[0]+dx+hidden.cols=0)和(位置[1]+dy+hidden.rows
其中,maxWidth和maxHeight是图像的宽度


希望这能让您走上正轨。

如果您在Linux环境中,您可以使用valgrind查找分段错误发生的确切位置。只需在程序名称或执行程序的方式之前键入valgrind。例如,如果您使用以下命令执行程序:

你好-打印

改为发出以下命令:


valgrind hello-print

您需要确定segvfault-occours的位置。我猜这与vector::iterator iter线有关。是的,这正是我推测的。事实上,在仔细放置了一些print语句之后,我非常确定这就是故障发生的地方。问题是:我如何处理这些信息?验证Move()和Draw()是否正确方法适用于存在的对象,所以我在使用draw方法之后添加了一个print语句
location[0] += (((location[0] + dx >= 0) & (location[0] + dx + hidden.cols < maxWidth)) ? dx : 0);
location[1] += (((location[1] + dy >= 0) & (location[1] + dy + hidden.rows < maxHeight)) ? dy : 0);