我正在尝试在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 :(得分: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
方法或其他地方可能存在问题。
根据您提供的有限信息,很难调查真正的原因,但我建议您可以深入了解其他代码。