본문 바로가기
프로젝트

OpenCV

by Alkaloid 2018. 12. 27.
반응형

1. 영상의 표현방법


1) 그레이스켈일 영상 (Grayscale)

색상정보가 없고 오직 밝기 정보로만 구성되있고 , 밝기 정보를 256단계로 표현 한다.

하나의 픽셀값은 0~255사이의 정수 값을 가진다. (0:검은색 255:흰색)

c/c++에서 unsigned char로 표현한다.


typedef unsigned char uchar;

typedef unsigned char BYTE; 


2) 트루컬러 영상(Truecolor)

다양한 색상을 표현할수 있다. → Red,Green,Blue를 256단계로 표현 즉, (256^3 = 16,777,216)색상 표현이 가능하다.

각각 0~255까지 범위로 표현가능하다.(0:해당 색이 전혀 없는상태 255:해당색이 가득찬 상태)

#FF0000 

#00FF00 

#0000FF 

 255,0,0 (빨강)

0,255,0(초록) 

0,0,255(파랑) 


3) 픽셀(Pixel)

영상의 기본단위(Picture element), 화소




영상에서는 2차원 배열을 사용한다.


2. 프로그래밍 기초 


1)정적 2차원배열


unsigned char a[5][10] 

 ※ 배열 생성

a[0][0] 

a[0][1] 

a[0][2] 

.... 

a[0][10] 

a[1][0]

a[1][1]

a[1][2] 

....

 .... 

a[2][0]

a[2][1]

a[2][2] 

.... 

a[5][10] 


unsigned char:1바이트 사용(0~255사이의 정수를 표현할수있다.)

단점 : 배열의 크기를 미리 알고있어야 하기 때문에 다양한 크기의 영상을 표현하기 부족하다.

   Stack에 메모리를 할당하기때문에 대략 1MB 까지 할당가능하다.



※Char 와 unsigned char의 차이점 ?

  char에는 음수가 있지만(-128~127) unsigned char에는 음수가 존재하지 않는다.(0~255)


2)동적 2차원배열

 int w = 5;

 int h = 10;


 unsigned char ** a;                  //로컬 포인터 변수공간

 a=new unsigned char*[h];         // 동적 할당된 포인터형 공간

 for(int i = 0; i < h ; i++){

     a[i] = new unsigned char[w];  //동적 할당된 데이터 공간

 }

특징 : 행 단위로만 연속된 메모리 공간이 보장된다.

   프로그램 동작중 다양한 크기의 영상을 재생할수 있다.

   Heap 영역에 메모리를 할당한다. 즉 x86의 경우 2GB까지 할당가능(X64의 경우 8TB가능)



2-1) 동적 2차원 배열의 생성 & 초기화

 #include <memory.h>

  . . . .


 unsigned char** a;

 a=new unsigned char * [h];

 for(int i  = 0; i < h ; i++){

      a[i]=new unsigned char[w];

      memset(a[i],0,sizeof(unsigned char)*w);  //a[i]번지부터 sizeof(unsigned char)*w 바이트 크기만큼 메모리공간을 0으로 설정

}

memset 함수는 연속된 메모리의 시작점부터 연속된 범위의 어떤 값(바이트 단위)으로 모두 지정하고 싶을때 사용한다.

memset(메모리의 시작 주소, 메모리에 채우고자 하는값, 채우고자 하는 메모리(바이트)크기 );


반응형