Pixel Access
at operator
- image.at <DATA_TYPE> (WANT_ROW, WANT_COL)
- DATA_TYPE: image를 구성하는 픽셀의 Data type
- WANT_ROW: access 하고 싶은 y축
- WANT_COL: access 하고 싶은 x축
- 장점: 안전한 방식
- 단점: 느림
value = image.at<uchar>(50, 100);
value_B = image.at<Vec3b>(50, 100)[0];
channel = 1, data type = unsigned character, gray scale
channel = 3, data type = Vec3b, [0]: blue
pointer
- 장점: at operator보다 빠름
- DATA_TYPE* p;
p = image.ptr<DATA_TYPE>(WANT_ROW);
p[WANT_COL (* channels + BGR)];uchar* p; p = image.ptr<uchar>(50); value_B = p[100 * channels + 0];
포인터 선언
50번째 행의 포인터 접근
50번째 행에서 100번째 열(100, 50), 0: blue
data member function
- Fast
- Hard to figure out inappropriate access
- Mat image(ROW, COL, CV_TYPE);
- DATA_TYPE* data = (DATA_TYPE*)image.data;
- data[WANT_ROW * image.cols + WANT_COL (* channels + BGR)]
- ROW: Number of Rows(Height)
- COL: Number of Columns(Width)
- CV_TYPE: Type type (ex: CV_8UC3 = 8 bit 3 channels)
- DATA_TYPE: Mat Date Type (Ex float, unsigned char)
- WANT_ROW: The row to access
- WANT_COL: The column to access
uchar* data = (uchar*)image.data;
value_B = data[(50 * image.cols + 100) * channels + 0];
포인터는 행의 위치를 먼저 access한 후에 진행
질문 정리
1. exercise 2-2
h-1-j에서 -1을 하는 이유
0~5 -> h=5, 좌표의 갯수때문인가??
=> Array이기 때문에 배열의 갯수로 생각?, 0~h-1 -> 0, 1, 2,… h-1 -> h
2. at
=> 출력할 때 우리 눈에는 자동으로 ASCII코드로 보여진다
하지만 컴퓨터는 알아서 픽셀값에 접근
3. return 0의 의무
int함수라서?
=> 상관X, 있다면 문법적으로 완성
waitKey(0)에서 key가 안눌린다면 어차피 return 0은 안먹힘
4. image clone 필수?
=> Size를 모르기 때문에 접근을 할 수 없다. 그래서 필수!
5. exercise4
=> avg(픽셀값) //intensity level의 평균은 픽셀값의 평균과 거의 동일 (grayscale - blakc or white)
avg > 128 -> bright r > 1
else case -> dark r < 1