【问题标题】:OpenCV cv::Mat size limitOpenCV cv::Mat 大小限制
【发布时间】:2023-04-05 21:02:02
【问题描述】:

当我设置一个宽高大的 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 用于图像处理,这个限制几乎涵盖了任何类型的普通图像。

标签: c++ opencv mat


【解决方案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 如果可以的话,您应该考虑先尝试不将整个数据加载到内存中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
  • 2017-03-23
相关资源
最近更新 更多