전공지식정리/영상처리(Image Signal Processing)

1. opencv pixel access

TimeSave 2020. 12. 8. 23:30

Open CV/C++를 사용했다.
 -> C++언어로 설계하면서 Open CV라는 라이브러리를 가져다 쓴 것.

1. 이미지의 형태.
이미지 = 픽셀의 집합이다.
이미지의 표현 = 행렬

이미지는 픽셀의 집합.

2. Open CV의 Data type

CvPoint  : 이미지에서 x,y좌표 ex) (5,5)
CvSize    : 이미지 자체의 크기 ex) 640x480
CvRect   : 이미지 내의 특정 사각형 공간 정의
  ex)(10,30,5,5) ; 10,30의 점에서 5x5사이즈의 사각형 범위를 잡는다.
CvScalar : RGBA 색상을 표현. (val[0],val[1],val[2],val[3],)
 
struct CvScalar
{
double val[4];
};

IplImage : Image Processing Library Image라는 뜻.
                 영상을 표현하는 데이터 타입.
                 Gray,Color, 4 Channel 영상 (RGB+α)를 표현
                 각 채널은 정수, 실수형을 저장 가능.

IplImage 구조 : 객체지향적 구조.

CvArr는 CvMat의 추상기반 클래스
IplImage는 CvMat를 상속
CvArr* 타입이 사용된 자리는 CvMat* 또는 IplImage 타입을 대체해서 사용가능.

IplImage 구조체
Image structure. CvMat을 상속하며 영상을 표현하기에 적합한 추가항목이 존재.

변수
 int nChannels : number of color channel 
  ex) gray = 1, rgb color = 3
 int depth : pixel depth in bits
  ex) IPL_DEPTH_8U = 8bits unsigned char, 0~255
 int width : image width in pixels
 int height : image height in pixels
 char* ImageData : Pointer to aligned image data
 int widthstep : Size of aligned image row in bytes
IplImage* cvLoadImage(image_path) : 파일로 부터 이미지를 읽는다.
성공할 경우 메모리가 생성되어 IplImage pointer를 반환
 실패할 경우 NULL
IplImage* cvCrateImage(size,depth, channel) : IplImage 구조체의 메모리를 생성하여 그 포인터를 반환.
cvSaveImage(image_path,IplImage*) : 이미지를 파일로 저장
cvReleaseImage(IplImage **) : 이미지를 저장하고 있던 메모리 해제.
cvNamedWindow(window_name) : 윈도우를 생성, 및 이름부여
cvShowImage(window_name, IplImage*) : 해당하는 이름을 가진 윈도우에 이미지 출력
cvDestroyWindow(window_name) : 해당하는 이름을 가진 윈도우 제거

2. IplImage 구조체로 픽셀데이터 접근
 imageData : OpenCV는 벡터를 표현하지 못해 일차원 행렬로 저장.
 BGR순서로

일차원 행렬(한줄)로 저장

 

일차원 행렬이 누적되어 표현.

 

위의 설명처럼. widthstep을 더하여 이동한다.

 cvGet2D : (x,y)의 intensity 값 얻기
    cvGet2D(IplImage*, y, x)
  ex)
   CvScalar s;
   s=cvGet2D(img, 30, 40);

 cvSet2D : (x,y)의 intensity 값 변경
CvScalar s = cvScalar(100,0,0);
cvSet2D(img,30,40,s);   // 30,40의 값을 s의 값으로 변경한다.

pixel 접근이 용이하게 만드는 Wraper class가 존재한다.
  Color Image ex)
 RgbImage wimg(img); // IplImage *img의 data를 공유.
 wimg[y][x].r : red channel pixel intensity
 wimg[y][x].g : green channel pixel intensity
 wimg[y][x].b : blue channel pixel intensity


Gray Image ex)
  BwImage wgimg(gimg); //IplImage *gimg의 data 공유.
 wgimg[y][x] : gray pixel intensity.

C++ 복습용 강의.
http://contents2.kocw.or.kr/KOCW/html/2017/kumoh/leehaeyeoun091/15/default.htm

'전공지식정리 > 영상처리(Image Signal Processing)' 카테고리의 다른 글

7. Hough Transform  (0) 2020.12.08
6. Canny edge detector  (0) 2020.12.08
5 Color Model  (0) 2020.12.08
4. Labeling  (0) 2020.12.08
2. linear filtering  (0) 2020.12.08