유사한 작업을 할 때 작성해야 하는 코드의 양도 작다.
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
...
더 복잡하고 메모리 해제를 직접 해 주어야 한다.
댓글 없음:
댓글 쓰기