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로 변환하여 직접 접근하기 때문에 가장 빠르게 접근할 수 있지만, 유효성 검사를 거치지 않아 잘못 접근하였을 때 알아내기 힘들다는 단점이 있다.
작성자가 댓글을 삭제했습니다.
답글삭제안녕하십니까? 컬러 영상의 채널은 어떻게 접근하나요?~
답글삭제어휴 이게 뭐야
답글삭제