写大OpenCv Mat

时间:2015-08-07 17:22:04

标签: c++ opencv pointers memory 64-bit

我试图将OpenCV Mat格式的大浮点矩阵写入二进制文件。我在Linux x64的虚拟盒子上。

我已经迷恋了536000000的计数器,所以看起来我已经溢出了"可疑线"在p + i * 4? (顺便说一句,断言没有检测到这种情况,为什么?)。

所以当我改变" int i" to" int64 i",一切似乎都没问题,但是我不确定是否可以安全地向char *指针添加2 ^ 32以上?

另外,OpenCV矩阵的最大大小是多少?

    bool WriteFloatMat(string path, const Mat &img)
    {
        ofstream fs(path, ios::binary);

        fs.write( (char*)&(img.cols), 4);
        fs.write( (char*)&(img.rows), 4);

        int64 sz_ = img.cols*img.rows;//
        assert(sz_ < numeric_limits<int>::max());//

        int sz = img.cols*img.rows;
        cout << sz << endl;
        int64 counter=0;
        int64 maxVal= numeric_limits<int>::max();
        char* p= image.ptr<char>();
        for(int i=0; i<sz; ++i)
        {
            assert(i*4 < numeric_limits<int>::max());//suspicious line
            fs.write( p+i*4, 4);
            ++counter;
            if(counter%1000000==0)
                cout << counter << endl;
            if(counter>maxVal)
                cout << "Out of limits!" << endl;
        }

        return true;
    }


void TestIO()
{
    //max matrix dimensions?
    int rows= 1000*1000*10;
    int cols= 100;
    Mat mat(rows,cols,CV_32FC1);
    mat=mat+7;

    double t = (double)getTickCount();
    WriteFloatMat("/media/dummy.big", mat);
    t = ((double)getTickCount() - t)/getTickFrequency();
    cout << "Times passed in seconds: " << t << endl;
}

更新 我理解为什么assert(i*4 < numeric_limits<int>::max());无法正常工作,因为i * 4溢出且&lt; 0所以assert(i*4 >=0 );有效。

1 个答案:

答案 0 :(得分:1)

OpenCV对图像的大小没有内部限制,它实际上将其视为一块内存。因此,您使用的C ++系统将受到限制。

对于它的价值,我发现boost数值库中的numeric_cast<>功能非常有助于捕获转换错误,就像您遇到的assert(i*4 < numeric_limits<int>::max())一样。 (当然,这个问题很微妙,所以它可能也没有帮助。)