Pixel Access

1 분 소요

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() -> 결과값: character?

=> 출력할 때 우리 눈에는 자동으로 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

카테고리:

업데이트: