2015년 8월 19일 수요일

OpenCV Mat 접근방법

OpenCV에서 이미지로 처리하는 데이터자료형 중 내가 가장 많이 쓰는 형태는 cv::Mat 이다. Mat에 접근하는 방법은 총 3가지가 있다.

1. 가장 기본적인 방법 at

1
2
cv::Mat image(IMAGE_ROWS, IMAGE_COLS, CV_TYPE);
image.at<DATA_TYPE>(ROW, COL);
cs
- IMAGE_ROWS: 이미지 크기의 높이
- IMAGE_COLS: 이미지 크기의 너비
- CV_TYPE: Mat의 한 픽셀에 들어갈 데이터 타입
  e.g) CV_8UC4: 한픽셀당 8bit짜리를 4 Channel 사용(RGBA이미지 일 때 많이 사용)
- DATA_TYPE: Mat 안에 들어갈 데이터 타입. (e.g.: float, int, cv::Vec3f 등)
- ROW: 접근하려는 픽셀의 행
- COL: 접근하려는 픽셀의 열

장점: 유효성 검사를 진행한 다음에 접근하므로 안정적이고 정확하게 접근 할 수 있음.
단점: 픽셀 접근에 있어 느림


2. 조금 더 빠른 접근 ptr

1
2
cv::Mat image(IMAGE_ROWS, IMAGE_COLS, CV_TYPE);
image.ptr<DATA_TYPE>(ROW,COL);
cs

위의 방법과 파라미터 종류와 사용하는 방법 모두 동일하지만, 포인터형으로 반환해서 그에 맞게 포인터 변수를 사용해서 접근한다는 점이 다르다. 장점으로는 위의 방법인 at 보다는 빠르지만, 데이터에 직접 접근하는 방법인 아래 3번보다는 느린 접근방법이다.

3. DATA에 직접 접근

1
2
3
cv::Mat image(IMAGE_ROWS, IMAGE_COLS, CV_TYPE);
DATA_TYPE* data = (DATA_TYPE*) image.data;
data[ROW * IMAGE_COLS + COL]
cs

cv::Mat 형태를 일반 C++에서 사용하는 데이터 array로 변환하여 직접 접근하기 때문에 가장 빠르게 접근할 수 있지만, 유효성 검사를 거치지 않아 잘못 접근하였을 때 알아내기 힘들다는 단점이 있다. 


댓글 3개: