当我设置一个宽度和高度较大的cv::Mat对象时,代码将运行异常...或打印"bgModel.size != tsize"。 当我降低宽度或高度时,打印"bgModel.size == tsize"。 似乎cv::Mat有大小限制。 有什么方法可以修改限制吗?
软件信息: Windows 10 OS, Visual Studio 2015, OpenCV 2.4.13.5 硬件信息。:i7-9700 CPU,64GB 内存。
C++代码如下:
int main()
{
int nWidth = 13529;
int nHeight = 10198;
unsigned long long int tSize = static_cast<long long int>(nWidth)*static_cast<long long int>(nHeight)*static_cast<long long int>(25);
try
{
cv::Mat bgModel;
bgModel.create(1, nHeight*nWidth*25, CV_32F);
if (bgModel.cols*bgModel.rows == tSize)
{
cout << "bgModel.size == tsize" << endl;
}
else
{
cout << "bgModel.size != tsize" << endl;
}
bgModel.release();
}
catch (...)
{
cout << "thrown exception...." << endl;
}
return 0;
}
我不确定为什么你需要这么大的cv::Mat
,但它的大小至少是12GB!!因此,如果您的代码编译为 32 位二进制文件,则此代码将不起作用。我很确定您的异常来自内存限制。
最后:bgModel.cols
和bgModel.rows
是int
,如果你将它们相乘,它会溢出,你的计算将是不正确的。 所以你需要像你为tSize
所做的那样铸造它.
另一个问题是create()
方法的定义如下:
void cv::Mat::create(int rows, int cols, int type)
如您所见int
cols
的数据类型范围无法处理3,449,218,550
nHeight*nWidth*25
。int
可以处理的最大2,147,483,647
。