1. cvLoadImage(const char * filename, int iscolor = CV_LOAD_IMAGE_COLOR);
iscolor 는 영상의 컬러를 지정하는 인수다.
- CV_LOAD_IMAGE_COLOR이면 3채널 컬러 영상
- CV_LOAD_IMAGE_GRAYSCALE이면 1채널 그레이 스케일 영상
- CV_LOAD_IMAGE_UNCHANGED이면 원본 영상 그대로 읽어온다.


2. int cvSaveImage(const char * filename, const CvArr * image);
영상을 파일에 저장한다. 영상포맷은 파일의 확장자에 의해 정해지며, 8비트 단일채널과 3채널 컬러영상으로 저장할 수 있다.


3. int cvWaitKey(int delay = 0);
delay / 1000초 만큼 지연 대기한다. delay = 0 이면 키를 누를 때 까지 무한히 대기한다.

4. int cvNamedWindow(const char * name, int flags);
윈도우 캡션으로 사용하는 윈도우를 생성한다. name은 윈도를 식별하는 ID로 사용된다. 윈도우의 크기를 영상의 크기에 맞게 자동 조절하는 flags = CV_WINDOW_AUTOSIZE 만을 지원한다.

5. void cvDestroyWindow(const char * name);
생성된 윈도우를 파괴한다. 하나 이상일 때에는 cvDestroyAllWindows(void)함수를 이용한다.

6. void cvShowImage(const char * name, const CvArr * image);
name 이름을 갖는 윈도우에 영상 image를 보여준다.


영상불러와 화면에 출력(칼라)

  if((srcImage=cvLoadImage("ear.jpg"))==NULL)
  {
  return;
  } 
 printf("colorModel       = %s \n", srcImage->colorModel);
 printf("channelSeq       = %s \n", srcImage->channelSeq);
  
 printf("image pixel size = %d x %d \n", srcImage->width, srcImage->height);
 printf("# of channel     = %d \n", srcImage->nChannels);
 printf("depth            = %d \n", srcImage->depth);

 cvNamedWindow("ear", CV_WINDOW_AUTOSIZE);
    cvShowImage("ear", srcImage);
    cvWaitKey(0);

 cvDestroyWindow("ear");
 cvReleaseImage(&srcImage);

 




(흑백)

cvLoadImage에서 두번째 인자를 CV_LOAD_IMAGE_GRAYSCALE 할 경우~!


'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

선, 사각형, 원, 타원 그리기  (0) 2011.10.30
카메라 입력받기  (0) 2011.10.30
IplImage 구조체  (0) 2011.10.29
Open CV 초보자가 하는 실수들 모음..  (0) 2011.10.26
카메라 입력받기  (0) 2011.10.26
Posted by 아몰라

OpenCv라이브러리는 Intel Image Processing Library (IPL)에서 만들어진 IplImage 형식의 이미지를 이용한다.

typedef struct _IplImage
{
    int  nSize;         // IplImage 구조의 크기
    int  ID;            //이미지 헤더의 버젼
    int  nChannels;    // 채널의 갯수

- n채널은 영상에서 color plane이 몇 개인지를 의미한다. 일반적으로 그레이 영상은 싱글, 컬러영상은 3~4개의 채널을 가지고 있다.


    int  alphaChannel; //알파채널의 갯수
    int  depth;         //비트의 픽셀의 깊이

- 이미지의 정보 깊이라고 할 수 있다. 픽셀값의 타입에 관한 정보를 가지고있다. 다음과같이!

 depth 설 명 
IPL_DEPTH_8U 8비트 unsigned 정수 
IPL_DEPTH_8S  8비트 signed 정수
IPL_DEPTH_16U 16비트 unsigned 정수
IPL_DEPTH_16S  16비트 signed 정수 
IPL_DEPTH_32S 32비트 signed 정수
IPL_DEPTH_32F 32비트 단정도 실수
IPL_DEPTH_64F 64비트 배정도 실수


    char colorModel[4]; /* ignored by OpenCV */
    char channelSeq[4]; /* ditto */
    int  dataOrder;     

- 채널 자료의 저장 순서를 의미한다. dataOrder = 0(IPL_DATA_ORDER_PIXEL)이면 인터리브 컬러채널(interleaved color channels)이고, 1이면 분리 컬러채널(separate color channels)을 의미한다. 인터리브 컬러채널은 컬러영상에서 각 화소의 채널 값인 BGR이 저장되고, 다음 화소의 BGR, 그 다음 화소의 BGR채널 순서로 저장되는 방식이다. 분리 컬러채널은 한 채널의 모든 화소가 저장된 후에 다음 채널이 저장되는 방식으로 컬러 값이 저장되는 것을 의미한다.


    int  origin;        //이미지의 방향
- 0이면 왼쪽 상단이 원점 (0,0)이고, 1이면 윈도우즈의 비트맵과 같이 왼쪽 하단이 원점이 된다. 기본값은 0이다.
                           
    int  align;         /* Alignment of image rows (4 or 8).
                           OpenCV ignores it and uses widthStep instead */
    int  width;         //이미지의 가로넓이 ,
    int  height;        //이미지의 세로넓이
    struct _IplROI *roi; //ROI에 대한 포인터
- Region Of Interest(ROI)로 영상에서 관심영역을 의미한다. roi의 자료형인 구조체 IplROI는 아래와 같다.
typedef struct _IplROI
{
  int coi;
  int xOffset;
  int yOffset;
  int width;
  int height;
}IplROI;
coi는 관심채널(channel of interest), xOffset, yOffset, width, height를 사용하여 영상내의 사각영역을 지정한다. roi가 NULL이 아니면 대부분의 OpenCV함수는 지정된 roi 영역에서만 연산을 수행한다. roi가 NULL이면 전체영상이 관심영역이 된다.



    struct _IplImage *maskROI; // ROI를 마스크하기 위한 포인터
    void  *imageId;     /* ditto */
    struct _IplTileInfo *tileInfo; /* ditto */
    int  imageSize;     //바이트에서 유용한크기
    char *imageData;  //이미지 정보에대한 포인터
    int  widthStep;   //바이트에서 정렬된 라인의 크기
- 한 행의 바이트 개수.
    int  BorderMode[4]; /* ignored by OpenCV */
    int  BorderConst[4]; /* ditto */
    char *imageDataOrigin; //정렬되지 않은 이미지 전체에 대한 포인터
IplImage;

정리

IPL과는 다르게 OpenCV에서는 IplImage의 지원에 대해 다음과 같은 몇 가지 제한을 가지고 있다.

- 각 함수들은 depth와 channel의 개수에 대해 제한적으로 지원된다. 예를 들어, 이미지 통계 함수들은 IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_32F의 depth를 가지는 이미지들은 싱글 채널 혹은 3-채널(채널 3개) 이미지만 지원된다. OpenCV에서는 이 단원의 시작 부분에서 언급한 파라미터들만 지원하며 IPL에서는 모든 이미지 형식에 대해 모든 함수에서 지원된다.
- OpenCv는 오로지 interleaved 이미지만 지원한다. planar 이미지는 지원하지 않는다.
- colorModel, channelSeq, BorderMode, BorderConst 필드는 지원되지 않는다.
- align 필드 역시 지원되지 않는다. 그 대신 widthStep으로 width와 align에서 사용하는 재계산을 간단하게나마 대체하여 사용 할 수 있다.
- maskROI와 tileInfo 필드는 반드시 0이어야 한다.
- COI는 극히 제한적으로만 지원된다. 지금은 오로지 이미지 통계 함수들은 0이 아닌 C이 값들만 받아들인다. CvtPixToPlane과 CvtPlaneToPix 함수들을 이용하여 작업하기 바란다.
- 모든 입력과 출력 이미지들의 ROI들은 서로 반드시 일치해야 한다. 예를 들어, Erode 함수의 입력과 출력의 이미지는 같은 크기의 ROI들을 가져야만 한다. IPL에서는 달라도 같은 효과를 줄 수 있지만 말이다.


이러한 모든 제한사항에도 불구하고 OpenCV는 IplImage에서 지원 될 수 있는 일반적인 이미지 형식들은 지원하고 있다. 또한 가능한 IplImage 형식의 일반적인 subset에서 IPL과 함께 제대로 이용될 수 있다.

참고- Opencv코리아, Opencv 프로그래밍

Posted by 아몰라

출처 - www.opencv.co.kr


1번하고 6번은 비트를 했다면 알아야지 ㅋㅋㅋㅋ....나머지는 새로운 정보네...

좋다~!!!



1. cvCreateImage를 했으면 cdReleaseImage를 해야만 한다.

그래야 메모리 누수를 막을 수 있다.

 

다행인것은 openCV로 만든 프로그램이 죽을때 알아서 메모리를 릴리스 한다.(잘 만들었지요.)

위에서 언급한 것은 본인이 만든 소프트웨어가 돌아갈때 계속해서 create만 하고 relase를 안하면 메모리를 잡아먹기만 하는것이다.

image 하나 불러서 보여주는 루틴의 소프트웨어로도 메모리 2기가 잡아 먹을수 있다!!!

 

2. OpenCV의 컬러 이미지 순서는 B,G,R 이다. 즉 Blue, Green, Red 이다.

보통 우리는 R,G,B로 생각하게 되고

MATLAB의 이미지도 R,G,B 순서이다.

 

3. 이미지는 좌측하단이 (1.1) , 즉 오리진인 경우와

좌측 상단이 (1,1) 인 경우가 있다. MATLAB에서 처리하는 것과 openCV에서 처리하는 것과

보통 우리가 사용하는 Image(jpg, BMP)의 오리진 코디네잇이 다를 수 있다.

결과 이미지가 업사이트 다운 되었다고 말하기 전에 한번 살펴보아라.

 

업사이드 다운의 해결방안은 cvFlip(IplImage, NULL, 0); 를 이용하면 된다.

 

 

4. 이미지의 결과가 90도로 기울어 졌다면

보통 열과 행(너비와 높이)을 거꾸로 계산해서 나오는 경우다.

 

5.  OpenCV의 많은 함수가 single channel 함수이다. 즉 그레이 이미지만 다룰 수 있다.

따라서 컬러이미지의 경우 3개의 그레이 이미지로 나눈다음 원하는 함수를 적용후 다시 합치면

된다. 이것이 아니꼬우면 상용 인텔 이미지 프로세싱 라이브러리를 구입하면 된다. 아니면 직접 만들어서 openCV 커뮤니티에

도움을 주면 된다.

이런 문제를 방지하고자 하면 메뉴얼에서 그 함수가 single channel을 지원하는지 아니면 multi channel을 적용하는지

한번쯤 주의깊에 살펴보면 된다.

보통 나오는 에러메시지가 depth 어쩌구 저쩌구이다.  depth는 채널의 깊이이다.

1이면 그레이 이미지 3이면 컬러이미지 4이면 컬러+알파채널이다.

 

 

6. 어떤 환경에서 프로그래밍을 하면 젤 먼저 해보는 예제가 hello world. 왜 이것을 하는지는 모르겠지만, 아마 어떤 이야기가 있겠지요. 그럼 그 다음에 해야하는데 디버깅툴을 알아보는 것. 내가 결국은 복잡한 프로그래밍을 할 것인데 그때는 디버깅을 어떻게 해야할 것인가? 이것을 반듯이 테스트 해봐야 한다. MS Visual Studio를 사용한다면 디버깅은 훌륭하게 지원하니까 별 문제가 안되는데

리눅스를 사용한다면 약간 머리를 써야 한다. 리바운드를 제압한 자가 시합을 제압한다라는 말, 디버깅을 잘하는 자가 좋은 프로그램을 만든다. 이 부분 반듯이 숙지하시길...

 

openCV경우는 조그만 창을 열어서 중간과정의 결과물을 보는것도 일종의 디버깅이고

메모리 누수를 막는것도 디버깅이고

복잡한 계산 결과를 저장한 변수가 제대로 저장하고 있나는 찾는 것도 디버깅이다.

디버깅에 대한 노하우를 반듯이 찾아서 습득하고 있을것.

디버깅 축에도 안드는 것이 컴파일  및 링킹 에러인데 자신이 만들어서 처음으로 컴파일 했는데

에러 메시지가 많고 영어라서 두렵고 짜증나는 것은 디버깅 축에도 못낀다. 사실 그 영어를 조금만 읽어보고

그 에러메시지를 구글에 때려 넣어서 찾으면 답은 금방 나온다. 디버깅은 컴파일도 잘되고 링킹도 잘되는 프로그램이

원하지 않는 값을 내 놓을때부터 본격적인 시작이다. 내가 변수를 잘 못썼을수도 있고, 논리적으로 잘 못 전개했을수도 있고

프로그램의 설계 자체가 잘못 되었을수도 있고 등등...


'프로그래밍 기초 > 영상처리' 카테고리의 다른 글

파일에서 영상읽기 및 화면에 출력하기  (0) 2011.10.30
IplImage 구조체  (0) 2011.10.29
카메라 입력받기  (0) 2011.10.26
Open CV 함수정리  (0) 2011.10.25
Open CV 설치 및 셋팅 (Visual 2010)  (0) 2011.10.25
Posted by 아몰라