2012-09-28 82 views
0

我想读取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”。

+0

你能剪切粘贴你的代码吗? 'data = newData;'行不应该编译,更不用说你遇到运行时问题。 –

+1

您在'mycode :: setData'函数的'data = newData'行中分配了相同的值480000次。如果两个缓冲区的大小相同,则可以使用'memcpy'。看看[这个答案](http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c/4810668)了解更多关于C++数组。 –

+0

对不起,我的错误,我编辑成“data [i] [j] = [i] [j]”。 –

回答

4

此数组:

int newData[600][800]; 

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

数组data也是如此,但由于代码片段的上下文很少,很难知道静态分配的内容与自动分配的内容。

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

1

如果您注释掉

mycode.setData (newData); 

编译优化器可以知道newData没有使用,所以

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

同样可以因此可能不会被执行淘汰。

这个问题可能存在于memcpy方法中,甚至是其他地方。

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

+0

我编辑了我的问题。 –