Opencv pixel접근

5050·2021년 7월 11일
0

컴퓨터비전

목록 보기
2/15

OpenCV에는 Mat이라는 자료형이 있다.
보통 imread라는 함수로 이미지를 읽는데
컬러이미지 같은 경우 unsigned char의 자료형으로 이미지의 width height 3의 크기로
흑백이미지는 unsigned char의 자료형으로 width height의 크기로 읽힌다.
그래서 각 픽셀에 접근할 때에는
for (int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++)
image.data[i
image.cols + j] = ??;
의 형태이다. (컬러일 때는 좀 더 연산이 들어감. 1차원 배열에 쭉 늘여서 BGRBGR이렇게 나온다고 생각하고 연산하면 됨.)

그런데, 우리가 이미지에 연산을 가하다보면 unsigned char의 범위를 넘어가는 값이 나온다
즉 255를 초과하거나, 실수의 범위가 필요하다.
그럴 때에는 CV_32F, CV_64F등의 자료형으로 써야하는데, 문제는 그 때에는 위처럼 data로 접근이 안된다는 것이다.
그럴 때에 at이나 ptr이라는 함수를 쓰게 되는데
for (int i = 0; i < image.rows; i++)
for(int j = 0; j < image.cols; j++)
image.at(i, j) = ??;

시간을 측정해보면 현저히 느리다. 아마 at 내부에서 매번 주소값을 계산해서 그런 거 같다.
이 것의 격차를 줄이기 위해 우리는 포인터를 쓸 필요가 있다.

이런 식으로 사용한다면 매번 at을 호출할 필요가 없기 때문에 속도가 다시 .data와 유사하게나오는 것을 확인할 수 있을 것이다.

profile
하이

0개의 댓글