'2011/10/26'에 해당되는 글 2건

  1. 2011.10.26 Open CV 초보자가 하는 실수들 모음..
  2. 2011.10.26 카메라 입력받기

출처 - 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 아몰라

출처 - www.opencv.co.kr

정말 설명 잘 되있네 그려~~~~~~




이번 강좌에서는 OpenCV 를 이용하여 간단하게 카메라 영상을 입력받아 IplImage 형 구조체에 넣고 출력 윈도우의 크기를 조절해서 화면에 보여주는 작업을 할 것입니다. 1편을 통하여 기본적인 셋팅 방법은 습득 하셨을테니 바로 아래와 같은 소스코드를 작성한 후 컴파일 해 봅시다.

  

- 소스 코드(압축 파일 첨부)

 

#include <cv.h>
#include <highgui.h>

 

void main()
{
    IplImage* image = 0;
    CvCapture* capture = cvCaptureFromCAM(0);
    cvNamedWindow( "T9-camera", 0 );

    cvResizeWindow( "T9-camera", 320, 240 );

       
    while(1) {
        cvGrabFrame( capture );
        image = cvRetrieveFrame( capture );

        cvShowImage( "T9-camera", image );
  
        if( cvWaitKey(10) >= 0 )
            break;
    }


    cvReleaseCapture( &capture );
    cvDestroyWindow( "T9-camera" );
}

 

 

- 소스 설명

 

일단 OpenCV 를 사용하기 위하여 영상처리 관련 라이브러리를 사용하기 위해 <cv.h> 를 include 하고 영상을 캡쳐 받고 윈도우로 보여주기 위해 <highgui.h> 를 include 하지만 사실 카메라 영상만 입력 받아 화면에 보여줄 것이라면 <highgui.h> 만 include 해도 됩니다.

 

  #include <cv.h>         // 영상 처리를 위한 header
  #include <highgui.h> 
// 카메라로 영상을 입력받거나 이미지를 읽어들이고 화면에 보여주기 위한 header

 

 

다음은 IplImage 구조체로 image 라는 포인터를 생성하여 앞으로 이 것으로 이미지를 받고 처리하게 됩니다. IplImage 의 구조체는 이미지에 관련된 다양한 정보를 가지고 있으며 char 형 imageData 를 가지고서 이미지에 직접적인 접근을 할 수 도 있습니다.

 

  IplImage* image = 0;

 

 

cvCaptureCAM() 함수를 이용 0 번째 연결된 카메라로부터 컨트롤을 얻어 옵니다. 숫자를 넣는 부분에 카메라의 인덱스 번호를 넣으면 현재 2 대 까지 연결이 가능하며 이렇게 연결된 capture 는 끝나기 전에 cvReleaseCapture() 함수로 release 해 주어야 합니다.

 

  CvCapture* capture = cvCaptureFromCAM(0);  // 0 번째 연결된 카메라로부터 컨트롤을 얻어 옵니다.

 

 

cvNamedWindow() 함수는 "T9-camera" 라는 타이틀의 윈도우를 생성합니다. 두번째 인자 값은 고정된 윈도우(0)를 생성 하거나 보여질 이미지의 크기에 맞게 자동 조절 윈도우(1)를 생성 할 수 있습니다. 두번째 인자를 0 으로 하고 아래 문장을 추가하면 윈도우 크기를 자유롭게 조절 할 수 있습니다. 이것은 입력 소스를 조절하는 것이 아니라 출력 창의 크기를 조절 하는 것이므로 화면의 크기를 키울 경우 사각 픽셀이 보이는 현상이 나타납니다.


  cvNamedWindow( "T9-camera", 0 );            // T9-camera 라는 이름의 윈도우를 생성, 0 은 고정된 윈도우를 생성
  cvResizeWindow( "T9-camera", 320, 240 );  // T9-camera 라는 이름의 윈도우 크기를 조절 width = 320, height = 240

 

 

그리고 카메라로 부터 매 프레임을 받아오기 위해서 while(1) 문으로 무한 loop 을 돌립니다. 이 무한 loop 는 if( cvWaitKey(10) >= 0 ) 문장을 통해 'ESC' 키가 눌려지면 종료하게 되고 종료되지 않는다면 다음과 같은 작업을 반복하게 됩니다. cvGrabFrame( capture ) 함수는 카메라로 부터 입력된 영상의 한 프레임을 잡고, cvRetrieveFrame( capture ) 함수는 잡은 프레임으로부터 이미지를 얻어 냅니다. 이 두 함수는 함께 쓰이며 카메라로부터 영상을 받아 이미지에 넣는 과정이라고 보시면 됩니다. 다음으로 cvShowImage( "T9-camera", image ) 함수는 image 를 "T9-camera" 라는 타이틀의 윈도우에 뿌려주게 되는데 해당 타이틀의 윈도우는 cvNamedWindow() 함수로 이전에 미리 만들어 두어야 합니다.


  while(1) {
      cvGrabFrame( capture );                    // 카메라로부터 한 프레임을 잡습니다.

      image = cvRetrieveFrame( capture );    // 잡은 프레임으로부터 IplImage 형 구조를 리턴 받아 image 에 넣습니다.

      cvShowImage( "T9-camera", image );  // "T9-camera" 윈도우에 image 를 보여줍니다.
  
      if( cvWaitKey(10) >= 0 )
          break;
  }

 

 

마지막으로 capture 를 release 하여 카메라와의 연결을 종료하고 윈도우를 소멸시키면 프로그램은 안정적으로 종료됩니다.


  cvReleaseCapture( &capture );
  cvDestroyWindow( "T9-camera" );

 

 

다음은 cvNamedWindow() 함수와 cvResizeWindow() 함수를 이용하여 윈도우 창의 크기를 변화 시켜 출력한 결과 화면입니다.

 

 

 

- 주요 함수

A.윈도우 관련

  cvNamedWindow( "T9-camera", 0 );
  cvShowImage( "T9-camera", image );
  cvDestroyWindow( "T9-camera" );

 

B.카메라 영상 캡쳐 관련

  CvCapture* capture = cvCaptureFromCAM(0);
  cvGrabFrame( capture );
  image = cvRetrieveFrame( capture );

  cvReleaseCapture( &capture );

 

 

Copyrights (c) 2005 OpenCV.co.kr. All rights reserved.

Media System Lab., Yonsei University
by Dong-Chul Kim, e-mail: opencv at opencv.co.kr

- T9T9.com


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

IplImage 구조체  (0) 2011.10.29
Open CV 초보자가 하는 실수들 모음..  (0) 2011.10.26
Open CV 함수정리  (0) 2011.10.25
Open CV 설치 및 셋팅 (Visual 2010)  (0) 2011.10.25
Open CV 란?  (0) 2011.10.25
Posted by 아몰라
이전버튼 1 이전버튼