2012년 12월 28일 금요일

OpenCV #2-3 Example (반복자로 영상 조회)

  • Example (반복자 - 컬렉션의 각 요소를 조회하기 위한 전문 클래스)

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

void colorReduce(cv::Mat &image, int div=64){
// 밑줄은 템플릿 메소드.
// 반복자는 cv::MaIterator_<cv::Vec3b> it; 또는,
// cv::Mat_<cv::Vec3b>::iterator it; 으로 선언.
// 반복자는 반환 타입이 명시되어야 한다.
// 컬러 감축을 처리하기 때문에 cv:Vec3b를 반환.
cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();
// 초기 위치에서 반복자 얻기
cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();
// 마지막 위치에서 얻기

for ( ; it!= itend; ++it) { // 모든 화소를 조회
// 각 화소에 대한 처리
(*it)[0]= (*it)[0]/div*div + div/2; // 포인터 형태 캐스팅
(*it)[1]= (*it)[1]/div*div + div/2;
(*it)[2]= (*it)[2]/div*div + div/2;
// 각 화소 처리 끝
 }
}

int main()
{
cv::Mat image = cv::imread("boldt.jpg");

colorReduce(image);

cv::namedWindow("Image");
cv::imshow("Image", image);
cv::waitKey(5000);

return 0;
}


  • Result


  • 부연 설명

 - 반복자의 시작 위치와 마지막 위치는 begin과 end 템플릿 메소드로 얻는다.
 - begin과 end는 cv::Mat) 인스턴스에 대한 참조자를 사용해서 얻을 수 있다.
 - cv::Mat 참조자를 생성할 때 이미 지정됬기 때문에 begin과 end 메소드에서 반복자 타입을 명시하는 경우를 피할 수 있다.
 - cv::Mat_<cv::Vec3b> climage = image;
 - cv::Mat_<cv::Vec3b>::iterator it = climage.begin();
 - cv::Mat_<cv::Vec3b>::iterator itend = climage.end();


  • 참고문헌 : OpenCV 2 Computer Vision Application Programming Cookbook