'개발/Image Processing'에 해당되는 글 18건

  1. 2009.01.08 cvFindContours
  2. 2008.12.22 OpenCV 유용한 함수 정리
  3. 2008.12.09 OpenCV 설정
  4. 2008.11.09 True Type Font (TTF) Format
  5. 2008.10.24 DCT 변환
2009. 1. 8. 19:49

cvFindContours


cvFindContours 함수는 이미지에서 contour를 찾은 후 contour의 갯수를 리턴

원형
int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq* first_contour,
                            int header_size=sizeof(CvContour), int mode, int mthod, CvPoint offset=cvPoint(0,0) );

패러미터
- image : 8비트 grayscale 영상만을 패러미터로 넘길 수 있다. 0이 아닌 픽셀은 1로, 0인 픽셀은 0으로 간주하여 자체적으로 2진 영상으로 처리하게 된다.

- storage : CvMemStorage 구조체의 포인터를 넘긴다. 실제로 contour 정보가 저장되는 공간이다.

- first_contour : 첫번째 최외곽 contour의 정보를 저장할 CvSeq 구조체의 포인터

- header_size : 시퀀스 헤더의 크기  ex) sizeof(CvContour)

- mode :  contour 검출 방법
  CV_RETR_EXTERNAL - 오직 최외곽 contour만을 검출한다.
  CV_RETR_LIST - 모든 contour를 검출하여 list로 저장한다.
  CV_RETR_CCOMP - 모든 contour를 검출한 후 2단계로 계층화한다.
                              상위 계층은 각 성분(component)의 외곽 경계를 나타내며 하위 계층은 성분 내부의
                              구멍(hole)을 나타낸다.
  CV_RETR_TREE - 모든 contour를 검출한 후 각 contour를 tree 형태로 구조화한다.

- moethod : approximation(생략산) 방법이다.
생략산이란 불필요한 연산량을 줄이기 위하여 모든 contour를 구하지 않고 추정
  CV_CHAIN_CODE - Freeman chain code를 사용하여 contour를 출력한다. 이것 외의 다른 모든 방법은
                            결과물을 polygon(다각형, 버텍스의 나열)로 출력한다.
  CV_CHAIN_APPROX_NONE - 모든 contour의 점을 chain code에서 point로 변환한다.
  CV_CHAIN_APPROX_SIMPLE - 가로, 세로, 대각선 으로 쪼개서 압축하며 함수는 끝점만을 출력한다.
  CV_CHAIN_APPROX_TC89_L1, CV_CHAIN_APPROX_TC89_KCOS - Teh-Chin chain approximation
                                                                                              알고리즘에 사용된다.
  CV_LINK_RUNS - 1의 수평 구획의 연결을 통해 완전히 다른 방식의 contour 검출 알고리즘을 사용한다.  
  CV_RETR_LIST 모드에서만 사용 가능하다.

- offset : 모든 contour 포인트 이동
 
예제

CvMemStorage* storage = cvCreateStorage(0); // 배열 자료형 : 점의 좌표가 들어감
CvSeq* seq = NULL; //경계 개수를 저장할 변수 선언
int numContour = cvFindContours(src, storage, &seq, sizeof(CvContour), CV_RETR_TREE,   
                                             CV_CHAIN_APPROX_SIMPLE);

2008. 12. 22. 22:50

OpenCV 유용한 함수 정리

1. 영상 입출력

//영상 읽기
cvLoadImage()

//영상 보기
cvShowImage()

//영상 저장
cvSaveImage()



2. 창 제어

//창 생성
cvNamedWindow()

//창 이동
cvMoveWindow()

//창 파괴
cvDestroyWindow()

//모든 창 파괴
cvDestroyAllWindow()

//창 크기 조절
cvResizeWindow()



3. 영상 조작

//영상 데이터 할당
cvCreateImage()

//할당한 영상 데이터 해제
cvReleaseImage()

//영상 데이터 복제
cvClonemage()


4. 침식 팽창
/*    침식    */
cvErode();
        
/*    팽창    */
cvDilate();

 

2008. 12. 9. 23:10

OpenCV 설정

source : http://cafe.naver.com/opencv.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1

OpenCV 초보를 위한 강좌 1편

OpenCV 는 인텔에서 만든 강력한 영상처리 라이브러리입니다. 강력한 기능과 성능에도 불구하고 3D 의 오픈소스 라이브러리인 OpenGL 처럼 알려지지도 않고, 활발하게 개발되지도 않고, 자주 쓰이지도 않아 안타까운 심정입니다. 더욱이 국내에는 아직 활성화된 커뮤니티가 없어 자료를 구하기도 어려운 실정입니다. 그리하여 본인이 자료를 수집하고 공부하는 과정에서 부딪친 문제점들의 해결방법들과 습득한 지식들을 강좌를 통해 풀어나가 보려고 합니다. 강좌는 다음과 같은 목차로 진행될 예정이며 예제 위주와 간결한 문체를 사용하여 정리 하도록 하겠습니다. 개발 환경은 별도로 거론하지 않는다면 다음과 같습니다.

 

- Windows XP Platform

- Visual C++ 6.0

- OpenCV beta 5.0a

 

 

- 목 차 -

1. OpenCV 란 무엇인가?

2. OpenCV 설치하기

3. OpenCV 셋팅

  3.1 Visual C++ 6.0

  3.2 Visual Studio .Net

4. OpenCV 테스트

 

 

- 본 문 -

1. OpenCV 란 무엇인가?

- OpenCV(Open Source Computer Vision) 인텔에서 만든 강력한 영상처리 라이브러리입니다.

- 기초 영상처리서부터 고급 수준의 영상처리 까지 상당한 량의 알고리즘들이 함수로 구현되어 있습니다.

- Binarization, Noise, Motion Detect, Edge Detect, Pattern Recognition, Hidden Markov Model 등등

- 오픈소스로서 스펙만 맞추면 자신의 알고리즘도 라이브러리에 등록 시킬 수 있습니다.

- 인텔의 OpenCV 사이트 http://www.intel.com/technology/computing/opencv/index.htm

 

 

2. OpenCV 설치하기

- OS Platform 에 맞게 OpenCV 라이브러리 다운받아 설치합니다.

- Linux 와 Windows 용이 있고 Mac OS 에서도 돌아간다고 합니다.

- 최신 OpenCV 가 Release 되는 곳

    http://sourceforge.net/projects/opencvlibrary

 

- 다운받기 OpenCV beta 5.0a for Window platform

    http://nchc.dl.sourceforge.net/sourceforge/opencvlibrary/OpenCV_b5a.exe

    http://keihanna.dl.sourceforge.net/sourceforge/opencvlibrary/OpenCV_b5a.exe

 

 

3. OpenCV 셋팅

기본적을 OpenCV 를 돌아가게 하려면 크게 4가지 작업을 해주어야 합니다.

 

1. 첫번째, Visual Studio 셋팅에서 디렉토리 추가하기

  개발 환경에서 컴파일러가 헤더 및 라이브러리 파일들을 찾을 수 있도록 한번만 셋팅해 주면 됩니다.

 

  - Include files

    C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
    C:\PROGRAM FILES\OPENCV\CV\INCLUDE
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE

 

  - Library files

    C:\PROGRAM FILES\OPENCV\LIB

 

2. 두번째, 프로젝트에 Link 하기

  라이브러리 파일들을 링크 해 줍니다.

  원칙적으로는 소스 코드에 쓰인 라이브러리만 링크 해주면 되지만 일일이 어디에 속해 있는 함수인지 알기가 번거로움으로 일반적으로는 앞에 세가지를 기본적으로 링크하면 됩니다.

  cxcore.lib, cv.lib, highgui.lib, cvcam.lib

 

3. 세번째, 소스파일에 header 파일 include 하기

  #include <cv.h>

  #include <cxcore.h>

  #include <highgui.h>

 

4. 네번째, dll 파일 복사하기

  C:\Program Files\OpenCV\bin 폴더에서 다음과 같은 파일들을 Workspace 파일이 있는 폴더에 복사 합니다.

  만약에 라이브러리를 사용하지 않았을 경우에는 필요한 파일만 복사하면 됩니다.

    cv097.dll, cxcore097.dll, cvcam097.dll, highgui097.dll

 

 

3.1 Visual C++ 6.0

 

1. 메뉴에서 Tools >> Options >> Directories 에서 다음과 같은 디렉토리를 추가합니다.

  - Include files 항목에서 추가 할 디렉토리

    C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
    C:\PROGRAM FILES\OPENCV\CV\INCLUDE
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE

 

 

 

  - Library files 항목에서 추가 할 디렉토리

    C:\PROGRAM FILES\OPENCV\LIB

 

 

 

2. 메뉴에서 Project >> Settings >> Link 에 다음과 같은 파일들을 링크합니다.

    Win32 console 로 프로젝트를 생성하셔야 Project 메뉴가 활성화 됩니다.

    좌측 상단에 Settings For 항목은 'All configurations' 로 두고 아래 파일들을

    Object/library modules: 란에 적어 넣습니다.

 

      cxcore.lib cv.lib highgui.lib cvcam.lib

 

 

 

3. 소스코드에 다음과 같은 헤더 파일들을 include 해줍니다.

    #include <cv.h>

    #include <cxcore.h>

    #include <highgui.h>

 

4. 다음 폴더에서 나열된 dll 파일들을 현재 작업중인 소스파일이 있는 곳에 복사합니다.

  - 폴더: C:\Program Files\OpenCV\bin

  - 파일: cv097.dll, cxcore097.dll, cvcam097.dll, highgui097.dll

 

 

3.2 Visual Studio .Net

위의 과정과 동일하지만 메뉴가 조금 다릅니다.

 

1. 메뉴에서 Tools >> Options >> Projects >> VC++ Directories 에서 다음과 같은 디렉토리를 추가합니다.

  - Include files 항목에서 추가 할 디렉토리

    C:\PROGRAM FILES\OPENCV\CXCORE\INCLUDE
    C:\PROGRAM FILES\OPENCV\CV\INCLUDE
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\HIGHGUI
    C:\PROGRAM FILES\OPENCV\OTHERLIBS\CVCAM\INCLUDE

 

 

 

  - Library files 항목에서 추가 할 디렉토리

    C:\PROGRAM FILES\OPENCV\LIB

 

 

 

2. 메뉴에서 Project >> Properties >> Linker >> Input 에 다음과 같은 파일들을 링크합니다.

    Win32 console 로 프로젝트를 생성하셔야 Project 메뉴가 활성화 됩니다.

    좌측 상단에 Configuration 항목은 'All Configurations' 으로 하고 'Additional Dependencies' 란에 아래 파일들을 적습니다.

 

      cxcore.lib cv.lib highgui.lib cvcam.lib

 

 

 

3. 소스코드에 다음과 같은 헤더 파일들을 include 해줍니다.

    #include <cv.h>

    #include <cxcore.h>

    #include <highgui.h>

 

4. 다음 폴더에서 나열된 dll 파일들을 현재 작업중인 소스파일이 있는 곳에 복사합니다.

  - 폴더: C:\Program Files\OpenCV\bin

  - 파일: cv097.dll, cxcore097.dll, cvcam097.dll, highgui097.dll

 

 

4. OpenCV 테스트

위의 과정을 통하여 기본 셋팅이 끝났으면 OpenCV 를 이용하여 다음과 같은 간단한 이미지 뷰어를 만들어 보겠습니다.

소스 파일과 VC++ 6.0 에서 컴파일 할 수 있도록 셋팅된 workspace 파일을 아래 링크에 첨부하였습니다.

http://cafe.naver.com/opencv/6

 

 

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

  // 소스 코드 시작

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

 

  void main()
  {

      IplImage* image = 0;                          // image 선언

      image = cvLoadImage("t9t9.jpg", 1);     // t9t9.jpg 파일을 읽어 들임

 

      cvNamedWindow( "T9-viewer", 1);      // 윈도우 생성
      cvShowImage( "T9-viewer", image );  // 이미지를 보여줌
      cvWaitKey(0);                                   // 키 입력을 기다림

 

      cvDestroyWindow( "T9-viewer" );       // 윈도우 종료
  }

  // 소스 코드 끝

 

 

  - 결과 화면

 

 

 

 

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

2008. 11. 9. 16:58

True Type Font (TTF) Format


TTF 파일이란 Ture Type Font 파일을 의미하며

 

Mac과 Windows에서 지원하는 Vector Font를 말합니다.

이 파일 포맷에 대해서 다음 주소로 가면 관련 문서를 받을 수 있습니다.

 

http://www.microsoft.com/typography/SpecificationsOverview.mspx

 

 

관련 내용 중 

Chap 1은 주로 True Type Font의 기본 개념들을 이해하는데 도움이 되며

Chap 2는 TTF 포맷 내부를 보는데 도움이 됩니다.

 

그 외 내용은 필요한 경우 참고하면 됩니다. 

 

 

TTF 파일을 이용할 때 Vector Drawing을 Embedded System에서 직접 하려는 것은

시스템 성능이나 여러가지 계산 등의 문제 때문에 어려워 보입니다.

 

이런 경우에 이용할 수 있는 것이 다음 Tag와 관련된 정보입니다.

 

EBDT(Embedded Bitmap Data Table)

EBLC(Embedded Bitmap Location Table)

EBSC(Embedded Bitmap Scaling Table)

 

EBDT와 EBLC는 한글/한자와 같이 복잡한 경우에 Vector Drawing 대신에 Bitmap Drawing을 이용하려고 만들어 둔 것으로 보이며 이 Tag는 필수 사항이 아니고 옵션 사항이므로 모든 폰트가 지원하지는 않습니다.

일단 한글 Windows의 경우 기본적으로 제공되는 바탕, 굴림체 등을 보면 EBDT와 EBLC는 존재합니다. 그러나 휴먼체(한글 설치되면서 설치된 것으로 보임)와 같은 경우를 확인하면 EBDT와 EBLC가 존재하지 않습니다.

 

EBDT 등의 Tag는 결국 Bitmap 정보를 모두 가지고 있어야 하므로 지원 가능한 폰트 사이즈가 정해져 있습니다. 일반적으로 폰트 사이즈가 11에서 25 까지만 존재합니다.

 

PDA등에서 True Type Font를 지원하는 경우 순수하게 Vector Drawing을 하는지 아니면 EBDT와 EBLC를 이용하는지는 추후 확인해 볼 필요가 있습니다.

2008. 10. 24. 21:03

DCT 변환


   최근 대역 압축의 분야에서 많이 거론되고 있는 DCT에 의한 압축법에 대하여 간략히 알아보기로 한다. DCT(Discrete Cosine Transform, 이산 코사인 변환)는 직교 교환의 하나로서, DFT와 같은 종류라 할 수 있다. Discrete는 이산, 즉 디지털 신호를 의미한다. DCT에 의한 정지 영사으이 대역 압축이 JPEG에 의하여 규격화되었기 때문에, 이에 근거하여 설명하기로 한다. DCT 수행 과정을 살펴보면, 영상 데이터를  의 블록으로 나누고, 이 블록 내의 화소에 대해서 DCT의 연산을 행한다. DCT의 변환식은,

   이고, 역 변환식은,

   이다.
   위의 수식에서, f(i,j)는 입력영상, F(u,v)는 변환 영상이고, 계수 C(u)는,

   으로 결정된다. 위의 DCT 변환식과 역 변환식에서 알 수 있는 것과 같이 cosine을 곱하여 변환을 취하고 있다. 이 cosine과 같이 변환할 때 사용되는 함수를 기저 함수라고 하면, 영상을 취급하는 경우는 특히 기저 영상이라고 부른다. DCT에서 사용되는 기저 영상의 일부를 [그림 6.12]에 나타내었다.

[그림 1] DCT 기저 영상의 일부

   [그림 1]에서 알 수 있는 것과 같이, u=0, v=0은 직류 성분을 나타내고, u,v가 클수록 높은 주파수를 나타낸다. 따라서 기저 영상은 주파수마다의 영상을 볼 수가 있다. 역 변환식을 잘 보면, 변환 영상 F(u,v)는 주파수마다의 기저 영상의 계수가 됨을 알 수 있다. 결국, 변환 영상은 원 영상을 주파수 별로 분해할 때 성분이 크게 된다는 것을 나타내고 있다. 그리고 대역 압축 과정을 살펴보면, 낮은 주파수의 성분(저역 성분)의 에너지는 크지만, 높은 주파수의 성분(고역 성분)의 에너지는 작아진다고 하는 영상의 성질을 이용하여 대역을 압축한다. 결국, cosine변환을 하여 주파수 별로 분할할 때에, 고역의 계수 (u,v)가 큰 변환 영상 F(u,v)는 작고, 이것이 1이하의 경우는 0이 되도록 하는 것이다. DCT 변환식을 예로 살펴보기로 하자. 영상 데이터를 8비트로 하면, 이식은 64회의 연산으로 충분하기 때문에, DCT의 계산의 결과, 변환 영상은 영상 데이터의 64배 결국 14비트가 되지만, 전체를 1/4로 하기 때문에, 이결과의 16배가 된다. 따라서 이 과정을 수행한 후 DCT 변환 영상은 12비트가 된다. 이것을 1/16로 하면 원 영상의 데이터와 같은 8비트가 된다. 결국 12비트의 변환 영상을 8비트로 양자화하는 것이 되고, 고역 성분에 대해서는 할당하는 비트 수를 감소시키는 결과가 된다. DCT 변환 후 16으로 나누면 변환 영상은 8비트가 되지만, 고역의 경우는 더 큰 값으로 나누면 비트 수를 감소시킬 수 있다. 나누는 값을 주파수 별로 나타낸 표를 양자화 테이블 또는 Q테이블이라고 부르는데 그 예를 아래 [표 1]에 나타내었다. 이와 같이 양자화를 행하면, 고역의 변환 계수는 0이 많게 되므로 run length 부호화와 허프만 부호화를 이용하여 압축을 할 수 있다.

 

[표 1] 양자화 테이블

   run length 부호화에서는 0이 연속되는 경우가 많을수록 압축률이 높게 되므로, [그림 2]에 나타낸 것과 같이 지그재그 스캔을 하여 고역 성분을 모으고, 그후에 run length 부호화와 허프만 부호화로서 압축을 하는 경우가 많고, 블록 내의 평균 명도를 나타내는 직류 성분 (u=0, v=0)에 대해서는, 이웃의 블록의 명도와 관계가 크기 때문에, DPCM을 이용하여 압축하는 경우가 일반적이다.

 

[그림 2] 지그재그 스캔