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.colsbgModel.rowsint,如果将它们相乘会溢出,并且您的计算将不正确。所以你需要像为tSize所做的那样投射它。

另一个问题是create()方法是这样定义的:

void cv::Mat::create(int rows, int cols, int type)  

如您所见,colsint 数据类型范围无法处理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 矩阵?

CV::Mat介绍

OpenCV实战——OpenCV核心数据结构

OpenCV2:总结篇 cv::Mat

OpenCV 并从 OutputArrays 或 (Mat) 读取数据

在 OpenCv 中对 cv::Mat 进行排序