2013년 10월 31일 목요일

OpenCV에서 cv::Mat 의 사용

최신 버전의 opencv에서 제공하는 C++ 인터페이스를 사용하자.  C인터페이스에 비해 사용이 쉽고, 안전하며, 메모리 관리가 용이하다.
유사한 작업을 할 때 작성해야 하는 코드의 양도 작다.

예로 Mat 클래스를 살펴보자. opencv에 있는 imread 함수는 (cvMat타입이 아니라) Mat타입을 리턴한다.
cvMat는 C언어 인터페이스, Mat는 C++ 인터페이스이다.




(예제) 이미지를 읽고 일부분을 떼어 낸다.

cv::Mat image = imread("face.jpg");
if(image.empty()) return;

cv::imshow("face", image);

cv::Mat bw = image > 128; // threshold image into binary
cv::Mat crop = image(cv::Rect(50,50,150,200)); // 100x150 크기의 부분 이미지
crop = 0; // set image to 0

cv::waitKey();

코드가 직관적이고 단순하다.
예제에서 모든 이미지 행렬 할당은 같은 데이터를 가리킨다. 따라서 crop 행렬을 0으로 만들면 image의 해당 부분을 0으로 만들어 버린다.  따라서 데이터의 새로운 복사본을 만드는 것이 필요하다. Mat::copyTo나 Mat::clone()을 사용한다.




만일 상기한 예제를 C 인터페이스로 작성하였다면 아래와 같다.

IplImage* pImg= CvLoadImage("face.jpg");
if(pImg==NULL) return;

....

CvShowImage("face", pImg);
cvWaitKey();
CvReleaseImage(&pImg); // release the assigned memory
...

더 복잡하고 메모리 해제를 직접 해 주어야 한다.

댓글 없음:

댓글 쓰기