OpenCV cv::Mat 大小限制
Posted
技术标签:
【中文标题】OpenCV cv::Mat 大小限制【英文标题】:OpenCV cv::Mat size limit 【发布时间】:2021-07-02 07:18:52 【问题描述】:当我设置一个宽高大的 cv::Mat 对象时,代码会运行异常...或打印“bgModel.size != tsize”。 当我降低宽度或高度时,打印“bgModel.size == tsize”。 似乎 cv::Mat 有大小限制。 有什么方法可以修改限制吗?
软件信息。 :Windows 10 操作系统、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 构造函数和像create
这样的函数将int
作为宽度/高度的类型。所以你会受到 API 的限制。
@PeterT 我真的不称它为 API 限制。 Mat 的每个维度都是 2147483647 .....我认为更多的情况是尝试在没有优化的情况下实现一个想法。
你可能认为这个限制是合理的,我在 2000 年也会这么认为。这并不能改变它是一个限制的事实。
@PeterT 但我们应该考虑将 opencv 用于图像处理,这个限制几乎涵盖了任何类型的普通图像。
【参考方案1】:
我不知道你为什么需要这么大的cv::Mat
,但它的大小至少是12GB!!!因此,如果您的代码被编译为 32 位二进制,则此代码将不起作用。我很确定您的异常来自内存限制。
最后: bgModel.cols
和 bgModel.rows
是 int
,如果将它们相乘会溢出,并且您的计算将不正确。所以你需要像为tSize
所做的那样投射它。
另一个问题是create()
方法是这样定义的:
void cv::Mat::create(int rows, int cols, int type)
如您所见,cols
的int
数据类型范围无法处理nHeight*nWidth*25
,即3,449,218,550
。最大int
可以处理的是2,147,483,647
。
【讨论】:
即使我尝试 bgModel.create(nWidth*5, nHeight*5, CV_32F),行和列也在 int 范围内。这也不可行....也许我应该考虑另一种方法来处理如此大的数据,而不是只使用一个 cv::Mat。 @AlennexCheng 如果可以的话,您应该考虑先尝试不将整个数据加载到内存中。以上是关于OpenCV cv::Mat 大小限制的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 中使用 OpenCV 创建 Mat 矩阵?