티스토리 뷰

3학년 2학기/openCV

픽셀

Hading 2016. 10. 13. 01:00

픽셀에 임의 접근하기 : at() method

                             (y)       (x)

Mat::at<Datatype>(int row, int col)


<좌표를 반환한다>

at 은 templete 함수이기 때문에 type 을 지정해야됨.



  • for grayscale images
   -  image.at<uchar> (r,c) = value;  // 값을 읽어오거나 저장이 가능함

  • for true color images

   -  image.at<Vec3b>(r,c)[channel] = value;

    channel: 0, 1, 2( 각 B,G ,R)  => 벡터로 생각하자

    r,c 위치의 백터 3의 위치에 저장하고 만약 R G B 중 한개의 값이다 하면 index를 사용해서 구분한다.


Vec<Type , Number>

  - typedef Vec(uchar,3) Vec3b;





void colorinvert(Mat &image) {

int numOfLines = image.rows;  // 이미지의 세로 길이를 알 수 있다.

int numOfPixels = image.cols; // 이미지의 가로 길이를 알 수 있다


for (int r = 0; r < numOfLines; r++) {  // 행의 위치 

for (int c = 0; c < numOfLines; c++) { // 열의 위치

Vec3b &vec = image.at<Vec3b>(r, c);

vec[0] = 255 - vec[0];

vec[1] = 255 - vec[1];

vec[2] = 255 - vec[2];


}

}

}

void grayscaleinvert(Mat &image) {


int numOfLines = image.rows;  // 이미지의 세로 길이를 알 수 있다.

int numOfPixels = image.cols; // 이미지의 가로 길이를 알 수 있다

for (int r = 0; r < numOfLines; r++) {  // 행의 위치 

for (int c = 0; c < numOfLines; c++) { // 열의 위치

uchar &value = image.at<uchar>(r, c);

value = 255 - value;


}

}

}



픽셀에 임의 접근하기 : operator() method

Mat_ (row,col)  => templete class 
  • for grayscale images
   -  Mat_ <uchar>grayimage = image;
   -  grayimage(r,c) = value;

  • for true color images
   -  Mat_<Vec3b>colorimage = image;
   -  colorimage(r,c)[channel] = value;


영상 스캐닝 : ptr() method 

인자로서 행의 번호를 지정하면 행이 시작하는 위치를 전달해 준다.


Mat::ptr<Datatype>(int row)  

  • for grayscale images
   -  uchar* data = image.ptr<uchar>(r);

  • for true color images
   -  <vec3b * data = image.ptr<vec3b>(r);
  • for grayscale & true color images
   -  uchar* data = image.ptr<uchar>(r);


영상 스캐닝 : iterators

C++ 에서 기본적으로 제공하는 라이브러리

  • for grayscale images
   -  MatIterator_<uchar>it;
   -  Mat_<uchar>::iterator it;

  • for true color images
   -  MatIterator_<Vec3b> it;
   -  Mat_<Vec3b> it;


영상 스캐닝 : 저수준의 포인터 연산

image data의 시작 위치 지정


uchar *data = image.data;

// 이미지 데이타의 시작 위치 포인터 설정

  • (r,c) 위치의 픽셀 접근(gray-scale image)

value = data + r* image.step+c;  

// 한 행당 r에다가 바이트 수를 곱하면 r,c의 위치에 접근할 수 있다.

  • (r,c) 위치의 픽셀 접근(true color image)

B_value = data + r*image.step + c*image.channels() + 0;

G_value = data + r*image.step + c*image.channels() + 1;

R_value = data + r*image.step + c*image.channels() + 2;


  • 다음 라인(줄)으로 이동

data += image.step;

// 한 행당 바이트 수

항상 4바이트의 배수가 되어야 된다.

부가적인 데이터가 들어간다.

실제 데이터의 개수( 불필요한 데이터 포함)

Mat::isContinuous() // 부가적인 정보가 있는 지 없는지 판별 가능  

                          // True or false

부가적인 데이터가 없다 => True



처리 속도 비교 ( 단위 : msec)



 

'3학년 2학기 > openCV' 카테고리의 다른 글

background  (3) 2016.12.05
Image segmentation  (0) 2016.12.05
사람의 피부 검출  (0) 2016.11.24
공간 필터링  (0) 2016.10.15
opencv 영상  (0) 2016.10.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함