레이블이 float인 게시물을 표시합니다. 모든 게시물 표시
레이블이 float인 게시물을 표시합니다. 모든 게시물 표시

2016년 4월 20일 수요일

opencv Mat 저장하기 (CV32FC1과 같이 UINT가 아닌 경우)

opencv에서 보통은 아래와같이 읽고, 저장한다.
Mat matImage = imread("asdf.png", IMREAD_UNCHANGED);
imwrite("asdf.png", matImage);

그런데 위의 경우는 주로 Mat의 element가 uint인 경우이다(depth는 1, 2, 3이든...)

하다보면 float인 경우가 있는데 이럴 때는
1. Mat의 포맷은 uint로 바꾸거 위 방법으로 저장하든,
2. FileStorage Class를 사용해야한다.

2의 방법을 사용하는 법은 아래와 같다. 이때는 이미지 포맷이 아닌 xml 혹은 yaml로 저장해야한다(확장자가).

저장할 때,
cv::FileStorage fs_w("asdf.xml", cv::FileStorage::WRITE);
fs_w << "matImage" << matImage; 
fs_w.release();
// fs_w << "matImage" << matImage << "변수명" << 변수 <<... // 만약 변수가 더있다면

불러올 때,
cv::FileStorage fs_r("asdf.xml", cv::FileStorage::READ);
// 방법1(Mat이 아닌 type인 경우).
int a = (int)fs_r["a"];
// 방법2(Mat인 경우).
Mat matImage;
fs_r["matImage"] >> matImage;
fs_r.release();

<출처: http://docs.opencv.org/2.4/modules/core/doc/xml_yaml_persistence.html>

사실 위 기능은 iostream과도 유사한데 속도면에서 더 빠르다고 한다.(약 50~60%정도)
<출처: http://stackoverflow.com/questions/16312904/how-to-write-a-float-mat-to-a-file-in-opencv>