Efficient Loading of Large Mat Objects with OpenCV
Loading large Mat objects into memory is a common operation in image processing applications. While the FileStorage method in OpenCV is a straightforward option, is there a more efficient alternative?
Faster Loading with Binary Format
The key to improved efficiency lies in saving and loading the Mat in binary format. OpenCV provides the matwrite and matread functions specifically for this purpose.
Significant Performance Improvement
Tests performed on Mat objects with varying sizes show a dramatic performance improvement when using binary loading over FileStorage. For a smaller image (250K rows, 192 columns), binary loading reduced loading time from 5.5 seconds to a mere 50 milliseconds. Similarly, for a larger image (1M rows, 192 columns), binary loading took only 197 milliseconds, while FileStorage failed to load due to memory limitations.
Implementation and Usage
The matwrite function takes a filename and a Mat object as input, while matread takes only the filename. The functions handle the necessary header and data storage/retrieval in binary format.
Sample Code
Here is an example code that demonstrates the matwrite and matread functions:
void matwrite(const string& filename, const Mat& mat) { // Header information ofstream fs(filename, fstream::binary); fs.write((char*)&mat.rows, sizeof(int)); fs.write((char*)&mat.cols, sizeof(int)); fs.write((char*)&mat.type(), sizeof(int)); fs.write((char*)&mat.channels(), sizeof(int)); // Data if (mat.isContinuous()) { fs.write(mat.ptr<char>(0), (mat.dataend - mat.datastart)); } else { int rowsz = CV_ELEM_SIZE(mat.type()) * mat.cols; for (int r = 0; r < mat.rows; ++r) { fs.write(mat.ptr<char>(r), rowsz); } } } Mat matread(const string& filename) { ifstream fs(filename, fstream::binary); // Header information int rows, cols, type, channels; fs.read((char*)&rows, sizeof(int)); fs.read((char*)&cols, sizeof(int)); fs.read((char*)&type, sizeof(int)); fs.read((char*)&channels, sizeof(int)); // Data Mat mat(rows, cols, type); fs.read((char*)mat.data, CV_ELEM_SIZE(type) * rows * cols); return mat; }
Conclusion
Using binary format for loading large Mat objects into memory offers a significant performance boost compared to the FileStorage method. The matwrite and matread functions provide a convenient and efficient way to implement this approach. By implementing this technique, you can reduce loading times and improve the performance of your OpenCV-based applications.
The above is the detailed content of Is Binary File I/O a More Efficient Alternative to FileStorage for Loading Large OpenCV Mat Objects?. For more information, please follow other related articles on the PHP Chinese website!