기본적인 사용법은 아래와 같다.
fourcc에 넣을수 있는 값들은 여러가지가 있지만, 대표적으로 x264와 XVID를 사용할 수 있다.
LAGS 옵션은 lossless 이다.
cv::VideoWriter vw;
vw.open(save, cv::VideoWriter::fourcc('X', '2', '6', '4'), fps, frame.size(), true);
vw.set(cv::VIDEOWRITER_PROP_QUALITY, 30);
...
vw << frame;
...
//소멸자에서 자동 저장
cv::Mat Uchar2CvMat(uchar* bytes, int width, int height,int channel) {
cv::Mat img = cv::Mat(height, width, CV_MAKETYPE(CV_8U,channel), bytes).clone();
return img;
}
uchar
를 다루는 도중 cv::Mat
이 해제될수도 있기 때문에 원시타입간 변환에는 clone 을통해 복사하는 방식을 사용하는것을 추천한다.
uchar* CvMat2Uchar(cv::Mat img) {
uchar* ptr = (uchar*)calloc(img.cols*img.rows*img.channels(), sizeof(uchar));
uchar* beg = ptr;
for (auto&it = img.begin<uchar>(); it != img.end<uchar>(); it++) {
*ptr++ = *it;
}
return beg;
}
memcpy
와 같은 함수를 사용하면 안된다. 이유는 cv::Mat
이 Dense가 아닐수가 있기 때문이다. 이미지를 Crop 한경우에는 Sparse 이기 때문에 범용적인 cv::Mat
에서 변환할려면 반복자를 통해 순회하여야 한다.