Ngôn ngữ C++ có nhiều điều bất tiện, nó không có nhiều “tiện ích” như C#, không gọn gàng như Python. Nhưng vì tốc độ của C++ rất nhanh nên vẫn còn được sử dụng làm ngôn ngữ chính. Để khắc phục nhược điểm của C++, OpenCV có cung cấp function đọc ghi file cho nhu cầu ghi dữ liệu. Đọc ghi file trong OpenCV rất phù hợp cho việc đọc ghi các data đặc trưng của OpenCV.
Nếu ghi Mat() xuống file theo định dạng ảnh (jpg, png,…) thì khi đọc lại sẽ không giống như ghi. Vì mỗi định dạng ảnh có format khác nhau, cách nén khác nhau kể cả ghi bằng png. Mắt người thì sẽ không nhận ra nhưng máy tính thì thấy sự khác biệt dẫn tới kết quả bị sai lệch.
Đối với 1 số Mat() dùng để training model thì phải lưu lại chính xác. Giả sử ta đã tạo được 1 biến mat như hình:
Đọc file
C++
1 2 3 |
cv::FileStorage fs_read("mat.yaml", cv::FileStorage::READ); fs_read["mat"] >> mat; fs_read.release(); |
Python
1 2 3 |
fs_read = cv2.FileStorage('mat.yml', cv2.FILE_STORAGE_READ) mat = fs_read.getNode('mat').mat() fs_read.release() |
Ghi file
C++
1 2 3 |
cv::FileStorage fs_write("mat.yaml", cv::FileStorage::WRITE); fs_write << "mat" << mat; fs_write.release(); |
Python
1 2 3 |
fs_write = cv2.FileStorage('new_data.yml', cv2.FILE_STORAGE_WRITE) fs_write.write("floatdata", mat) fs_write.release() |
Tương tự như vậy bạn có thể ghi nhiều loại giá trị khác nhau xuống file. Ví dụ:
C++
1 2 3 4 5 |
cv::FileStorage fs_write("mat.yaml", cv::FileStorage::WRITE); fs_write << "mat" << mat; fs_write << "mat2" << mat3; fs_write << "mat3" << mat3; fs_write.release(); |