复制数据的奇怪错误

时间:2012-09-28 07:46:22

标签: c++ opencv matrix copy

我正在尝试在OpenCV中读取视频帧,然后将数据复制到我的另一个C ++代码中以执行其他操作。我的代码如下:

cv::Mat capturedFrame; 
int newData[600][800];
std::cout<<"Debug1 " << std::endl;
memcpy((char*)newData, (char*)capturedFrame.data, 600*800*sizeof(int) );
std::cout<<"Debug2 " << std::endl;
mycode.setData ( newData );
std::cout<<"Debug3 " << std::endl;

然后类“setData”定义如下:

char data [600][800];
void mycode::setData ( char newData[600][800] )
{
  for ( int m=0; m < 600; m ++ )
  {
      for ( int n = 0; n < 800; n ++ )
      {
          data[i][j] = newData[i][j]; 
      }
  }
}

但是代码在行中停止了:

    mycode.setData ( newData );

令我困惑的是,如果我删除这段代码,那么我可以在屏幕上看到“Debug1”到“Debug3”,这是正常的。但是如果我使用这个代码,即使没有在屏幕上打印出“Debug1”和“Debug2”,程序也会停止。这真的很奇怪。我还尝试注释掉“setData”类中的所有行,使其成为一个空类,但错误仍然是相同的。所以我认为这不是关于“setData”类。 我也知道“capturedFrame.data”是正确的,因为我对它执行了一些其他过滤器,结果很好。有人可以解释这里的错误吗?

编辑:

我使用了调试器,但没有错误消息,但程序刚刚停止响应。另外,我将数据类型更改为“char”。

2 个答案:

答案 0 :(得分:4)

这个数组:

int newData[600][800];

大于1 MB。如果这是一个局部变量,那么你可能会把堆栈吹掉。

同样可能适用于data数组,但由于您的代码段几乎没有上下文,因此很难知道静态分配的内容与自动分配的内容相比。

我认为你应该考虑动态分配这些大型数组。

答案 1 :(得分:1)

如果你发表评论

mycode.setData ( newData );

编译优化器可能知道newData未被使用,所以

memcpy((int*)newData, (int*)capturedFrame.data, 600*800*sizeof(int) );

也可能被删除,因此可能尚未执行。

memcpy方法或其他地方可能存在问题。

根据您提供的有限信息,很难调查真正的原因,但我建议您可以深入了解其他代码。