我试图将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 );
有效。
答案 0 :(得分:1)
OpenCV对图像的大小没有内部限制,它实际上将其视为一块内存。因此,您使用的C ++系统将受到限制。
对于它的价值,我发现boost数值库中的numeric_cast<>功能非常有助于捕获转换错误,就像您遇到的assert(i*4 < numeric_limits<int>::max())
一样。 (当然,这个问题很微妙,所以它可能也没有帮助。)