-1

当我设置具有大宽度和高度的 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;
}
4

1 回答 1

3

我不知道你为什么需要这么大cv::Mat,但它的大小至少是12GB!!!因此,如果您的代码被编译为 32 位二进制,则此代码将不起作用。我很确定您的例外来自内存限制。

最后: bgModel.cols and bgModel.rowsare int,如果你将它们相乘,它会溢出,你的计算将是不正确的。所以你需要像你为tSize.

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

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

如您所见,无法处理int的数据类型范围是. Max可以处理的是。colsnHeight*nWidth*253,449,218,550int2,147,483,647

于 2021-07-02T07:32:42.067 回答