[opencv] tips

spring·2020년 11월 9일
0

1. VideoWriter

기본적인 사용법은 아래와 같다.
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;
...
//소멸자에서 자동 저장

2. cv::Mat 변환

2.1. uchar* to cv::Mat

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 을통해 복사하는 방식을 사용하는것을 추천한다.

2.2 cv::Mat to uchar*

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::MatDense가 아닐수가 있기 때문이다. 이미지를 Crop 한경우에는 Sparse 이기 때문에 범용적인 cv::Mat에서 변환할려면 반복자를 통해 순회하여야 한다.

References

profile
Researcher & Developer @ NAVER Corp | Designer @ HONGIK Univ.

0개의 댓글