Computer Vision2009. 4. 30. 00:07


SIFT의 동작은


아래와 같이 호출됩니다.


int sift_features( IplImage* img, struct feature** feat )

{

  return _sift_features( img, feat,

SIFT_INTVLS,

SIFT_SIGMA,

SIFT_CONTR_THR,

                         SIFT_CURV_THR,

SIFT_IMG_DBL,

SIFT_DESCR_WIDTH,

                         SIFT_DESCR_HIST_BINS );

}


영상과 feature는 포인터로 전달되고 나머지는  매크로로 정의되어 있습니다. 이렇게 하면

최상위 함수는 매크로에 따라 파라미터를 줄 수 있고 이하 하위 함수들은 인자들을 기반으로 할 수 있으므로

프로그램 테스트 등이 편리해집니다.


정의된 매크로들은 나중에 코드를 읽어가면서 새로운 그리고 필요한 매크로가 나온다면, 그때마다

하나씩 확인해 가기로 하고 여기서는 건너 뜁니다.


실제 호출은 위의 코드에서 보는 바와 같이 _sift_features를 호출하여 구동합니다.

이 함수는 다음과 같은 순서로 동작합니다.


1. 인자를 검사해서 오류가 있는지 확인을 합니다.

2. 주어진 이미지로 이미지 피라미드를 구축합니다.

3. 구축한 이미지 피라미드에서 DoG를 구축합니다.

4. DoG에서 특징점들을 추출하고

5. 특징점 을 좌표에 매핑하고,

6. 특징점 기술자들을 논문대로 정리한다.


이를 위한 호툴된 함수는 다음과 같습니다.

기계적으로 따라갑니다.


int _sift_features( IplImage* img, struct feature** feat, int intvls,

                    double sigma, double contr_thr, int curv_thr,

                    int img_dbl, int descr_width, int descr_hist_bins )

{

  IplImage* init_img;

  IplImage*** gauss_pyr, *** dog_pyr;

  CvMemStorage* storage;

  CvSeq* features;

  int octvs, i, n = 0;


  /* check arguments  

인자를 검사한다. NULL Pointer이면 에러를 출력한다.*/


  if( ! img )

    fatal_error( "NULL pointer error, %s, line %d",  __FILE__, __LINE__ );

  if( ! feat )

    fatal_error( "NULL pointer error, %s, line %d",  __FILE__, __LINE__ );


  /* build scale space pyramid; smallest dimension of top level is ~4 pixels

      이미지 피라미드를 구축한다.

     최상위 피라미드는 그 크기가 4 픽셀 정도이다.

   */


/* 최초의 이미지를 만들어 냅니다.

   이 이미지는 그레이 스케일로 생성됩니다.. */

  init_img = create_init_img( img, img_dbl, sigma );


  octvs = log( MIN( init_img->width, init_img->height ) ) / log(2) - 2;


/* 이미지를  가지고 가우시안 스케일 피라미드를 구성합니다. */

  gauss_pyr = build_gauss_pyr( init_img, octvs, intvls, sigma );


/* DoG 이미지 피라미드를 구성합니다. */

  dog_pyr = build_dog_pyr( gauss_pyr, octvs, intvls );


  storage = cvCreateMemStorage( 0 );


DoG에서 특징점들을 열심히 추출합니다.

  features = scale_space_extrema(

dog_pyr,

octvs,

intvls,

contr_thr,

                            curv_thr,

storage );


/* 추출된 특징들의 특성들을 계산합니다. */

  calc_feature_scales( features, sigma, intvls );


/*  이미지가 2배로 키워서 특징점들을 추출하였을 경우 이를 다시 조절합니다. */

  if( img_dbl )

    adjust_for_img_dbl( features );


/* 정규 좌표를 계산합니다. */

  calc_feature_oris( features, gauss_pyr );


/* Lowe’s Paper 6절에 따라서 특징점 기술자를 만들어냅니다. */

  compute_descriptors( features, gauss_pyr, descr_width, descr_hist_bins );



  /* sort features by decreasing scale and move from CvSeq to array */


  cvSeqSort( features, (CvCmpFunc)feature_cmp, NULL );


  n = features->total;


  *feat = calloc( n, sizeof(struct feature) );


  *feat = cvCvtSeqToArray( features, *feat, CV_WHOLE_SEQ );


  for( i = 0; i < n; i++ )

    {

      free( (*feat)[i].feature_data );

      (*feat)[i].feature_data = NULL;

    }


  cvReleaseMemStorage( &storage );

  cvReleaseImage( &init_img );

  release_pyr( &gauss_pyr, octvs, intvls + 3 );

  release_pyr( &dog_pyr, octvs, intvls + 2 );

  return n;


}


'Computer Vision' 카테고리의 다른 글

SURF Lib  (3) 2010.06.22
Rob Hess의 SIFT [8]  (7) 2009.06.21
OpenCV - Alpha Blending cvAddWeighted , cvFillPoly  (2) 2009.04.25
JPEG2AVI 를 맥에서 빌드하기  (0) 2009.04.24
OpenCV - cvSmooth  (2) 2009.04.22
Posted by GUNDAM_IM
Computer Vision2009. 4. 25. 15:04

Alpha Blending


알파 블랜딩을 OpenCV에서 하는 것을 구현해 보았습니다.

코드를 읽어가면서 정리하였습니다.


1. 프로그램의 순서


순서는 다음과 같습니다.


(1) 이미지 화일을 읽어들이고

      ...

      cvLoadImage

  ...

(2) 알파블랜딩할 이미지를 만듭니다. - 이경우는 만들었지만 다른 이미지를 사용해도 됩니다.

...

cvFillPoly

...


(3) 원본 이미지와 알파블랜딩할 이미지의 크기가 틀리다면

      ROI로 서로의 크기를 맞추어 줍니다.

.....

cvSetImageROI

....

cvResetImageROI

...


(4) 적절한 비율로 블랜딩합니다.

....

cvAddWeighted

....


(5) 이후에 정리합니다.

  cvSaveImage(argv[2] , imgA );

  .....

      cvReleaseImage(&imgA);

      cvReleaseImage(&imgB);



2. 새로운 함수


2.1 cvFillPoly


여기에서 새로 나온 이미지 처리 함수는 다음과 같습니다.


cvFillPoly


2차원 폴리곤을 만들어서 그 폴리곤을 그리고 내부를 채웁니다.

폴리곤의 꼭지점 개수는 제한이 없습니다. 다만 시작하기 전에 해당 폴리곤의 꼭지점 개수를 알려주어야 합니다.



이 함수를 사용하기 위해서 다음과 같은 순서로 합니다.


(1)  폴리곤을 만듭니다. 이 프로그램에서 코드는 아래와 같습니다.

  ....

  CvPoint imgb_rectangle_pts[4] = { cvPoint( 0, 0) ,

    cvPoint(0,imgb_size.width),

    cvPoint(imgb_size.height,imgb_size.width),

    cvPoint(imgb_size.height,0)

  };

   ...

  CvPoint *PointArray[2] = { & imgb_rectangle_pts[0]  , 0 } ;

  ...


 (2) 폴리곤의 개수와 각 폴리곤의 꼭지점 개수를 정합니다.

       

  int PolyVertexNumber[2] = { 4 , 0 } ;

  int PolyNumber = 1 ;


  지금은 하나뿐이므로, 한개의 폴리곤만을 지정한다.

 

 (3) 그리고 함수를 호출합니다.


  cvFillPoly(imgB ,

    PointArray ,

    PolyVertexNumber ,

    PolyNumber,

    CV_RGB(5,5,5),8,0);



2.2 cvAddWeighted


알파블랜딩을 해주는 함수입니다.

사용은 쉽습니다.

각 이미지 별로 가중치를 곱해서 더하는 것입니다


호출은 아래와 같습니다.

  ......

  double alpha = 0.5 ;

  double beta  = 1.0 - alpha ;

  cvAddWeighted(imgA, alpha , imgB , beta , 0.0 , imgA );

  ......







3. 전체 코드


전체 코드는 아래와 같습니다.


--------------------------------------------------------------------------------------------------


#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <errno.h>


#include <opencv/cv.h>

#include <opencv/highgui.h>




int main(int argc , char * argv[] ){


  // 파라미터를 체크합니다.

  // 귀찮으니까 간단하게 개수만 체크합니다.

  if( argc < 2 )

   {

      printf("usage : alpha src dst\n");

      exit(0);

   }


  // 원본 이미지를 읽어들입니다.

  IplImage *imgA = cvLoadImage( argv[1] , 1);

  //알파 블랜딩할 이미지를 만듭니다. 사각형으로 만들기로 하겠습니다.

  //입력되는 이미지의 크기가 정해진 것이 아니므로,

  //입력 이미지의 크기를 갖고 와서 상대적으로 높이를 맞춥니다.

  //넓이는 150 픽셀 정도로 맞춥니다.

  CvSize imga_size = cvGetSize(imgA);

  CvSize imgb_size = cvSize(150,imga_size.height);

  IplImage *imgB = cvCreateImage( imgb_size  , IPL_DEPTH_8U, 3);


  // 이제 내부에 채워지는 4각형을 만듭니다.

  // 사용할 함수는 cvFillPoly 입니다.

  CvPoint imgb_rectangle_pts[4] = { cvPoint( 0, 0) ,

    cvPoint(0,imgb_size.width),

    cvPoint(imgb_size.height,imgb_size.width),

    cvPoint(imgb_size.height,0)

  };



  CvPoint *PointArray[2] = { & imgb_rectangle_pts[0]  , 0 } ;

  int PolyVertexNumber[2] = { 4 , 0 } ;

  int PolyNumber = 1 ;

  cvFillPoly(imgB ,

    PointArray ,

    PolyVertexNumber ,

    PolyNumber,

    CV_RGB(5,5,5),8,0);


  // 원본 이미지와, 채울 이미지의 크기가 틀리기 때문에 원본 이미지에서 관심 대상

  // 영역을 설정합니다.

  cvSetImageROI(imgA, cvRect(0,0,imgb_size.width,imgb_size.height));


  // 드디어 알파블랜딩을 합니다. 

  double alpha = 0.5 ;

  double beta  = 1.0 - alpha ;

  cvAddWeighted(imgA, alpha , imgB , beta , 0.0 , imgA );

 

  // 이제 관심 영역으로 설정된 것을 풉니다.

  cvResetImageROI(imgA);



  // 폰트를 정합니다.

  CvFont font1;

  double hscale = 0.5;

  double vscale = 0.5;

  double shear = 0.0;

  int thickness = 1;

  int line_type = CV_AA;


  cvInitFont(&font1,CV_FONT_HERSHEY_COMPLEX,hscale,vscale,shear,thickness,line_type);


  // 글을 집어 넣습니다.

  cvPutText(imgA,"GUNDAM",cvPoint( 0,100) ,&font1,CV_RGB(255,255,255));

  cvPutText(imgA,"Red Commet",cvPoint( 0,120) ,&font1,CV_RGB(255,255,255));


  // 화면에 출력하고

  cvNamedWindow( "ImageA-1", 1) ;

  cvShowImage( "ImageA-1", imgA );

 

  cvWaitKey(0);

  cvDestroyWindow("ImageA-1");


  // 파일은 따로 저장합니다.

  cvSaveImage(argv[2] , imgA );


  // 그리고 끝냅니다.

  cvReleaseImage(&imgA);

  cvReleaseImage(&imgB);


 

}//end of main


--------------------------------------------------------------------------------------------------


4. 처리 결과


다음 그림은 그 결과입니다.

사용자 삽입 이미지

'Computer Vision' 카테고리의 다른 글

Rob Hess의 SIFT [8]  (7) 2009.06.21
Rob Hess의 SIFT [7]  (1) 2009.04.30
JPEG2AVI 를 맥에서 빌드하기  (0) 2009.04.24
OpenCV - cvSmooth  (2) 2009.04.22
Rob Hess의 SIFT [6]  (0) 2009.04.18
Posted by GUNDAM_IM
Computer Vision2009. 4. 24. 19:19

JPEG2AVI 를 맥에서 빌드하기


소스 코드는 이곳에서 다운로드 하면 됩니다.


http://sourceforge.net/projects/jpegtoavi/



README를 읽어보면 큰 문제는 없습니다. 그냥  make all을 하면 된다고 합니다.


하지만


make all


을 하면 다음과 같은 에러가 발생합니다.


gcc  -O3 -Wall -ansi -g -DLINUX -D__UNIX__ -DVERSION_MIN=5 -DVERSION_MAJ=1 -DVERBOSE=0 -c jpegtoavi.c -o jpegtoavi.o

In file included from jpegtoavi.c:28:

byteswap.h:5:20: error: endian.h: No such file or directory

byteswap.h:10:3: error: #error "Aiee: __BYTE_ORDER not defined\n";

jpegtoavi.c: In function ‘main’:

jpegtoavi.c:204: error: ‘off64_t’ undeclared (first use in this function)

jpegtoavi.c:204: error: (Each undeclared identifier is reported only once

jpegtoavi.c:204: error: for each function it appears in.)

jpegtoavi.c:204: error: syntax error before ‘jpg_sz_64’

jpegtoavi.c:206: error: nested functions are disabled, use -fnested-functions to re-enable

jpegtoavi.c:206: error: syntax error before ‘MAX_RIFF_SZ’

jpegtoavi.c:344: error: ‘jpg_sz_64’ undeclared (first use in this function)

jpegtoavi.c:351: error: ‘riff_sz_64’ undeclared (first use in this function)

jpegtoavi.c:354: error: ‘MAX_RIFF_SZ’ undeclared (first use in this function)



(1) endian.h는 machine/endian.h에 있다.

이를 수정한다.


== WAS ==

#include <endian.h>

#include <sys/types.h>

== IS ==

#include <machine/endian.h>

#include <sys/types.h>


(2) 나머지 에러는 그냥 다음과 같이 하여서 코드에 추가합니다.


#ifndef _OFF64_T_DEFINED

#define _OFF64_T_DEFINED

        typedef long long  off64_t;

#endif


그 후에 컴파일 하면 빌드가 잘 됩니다.



사용법은 간단합니다. 헬프를 치면 금방 알 수 있습니다.


jpg2avi -f fps imagesize jpegfile list > dst.avi


     -f fps : frame per second입니다.

     imagesize : Width , Height를 구분하여 입력합니다.

    그리고 jpeg file 이름을 나열합니다.


좀 황당한것이 avi 파일로 받기 위해서는 파이프를 통하여 받습니다.

파일로 세이브 할 것이지 정말..


하여튼 동작은 잘 합니다.


 ./jpegtoavi -f 1 844 633  IMG_1.jpg IMG_2.jpg IMG_3.jpg IMG_3.jpg IMG_4.jpg IMG_5.jpg IMG_6.jpg IMG_7.jpg IMG_8.jpg IMG_9.jpg > img.avi


첨부 파일은 img.avi를 올렸습니다.




다 올리고 홈피에 올리니,

사파리에서는 동영상이 잘 안보이네요

익스플로어에서는 보이는데,


이러다가 사파리를 고쳐야 할런지도~



'Computer Vision' 카테고리의 다른 글

Rob Hess의 SIFT [7]  (1) 2009.04.30
OpenCV - Alpha Blending cvAddWeighted , cvFillPoly  (2) 2009.04.25
OpenCV - cvSmooth  (2) 2009.04.22
Rob Hess의 SIFT [6]  (0) 2009.04.18
OpenCV - Convert Image  (0) 2009.04.11
Posted by GUNDAM_IM
Computer Vision2009. 4. 22. 19:55

() 글을 읽기 전에 
 글은 저와 같은 OpenCV초보자를 위해서 정리하는 것입니다.
전문가이시라면 굳이 읽을 필요가 없습니다.
공부하면서 정리하는 글이라서 서툰 부분이 많이많이 보입니다.


SIFT의 내용을 따라가다 보면 Smooth함수를 호출합니다.

그래서 이번에 OpenCV Smooth함수를 아래와 같이 정리하고 테스트를 해보았습니다.

중요한 포인트는 번역을 했지만 억지로 번역하여 넣지 않았습니다.  

예제는 인터넷에서 다운 받은것을 조금 수정하였습니다.

( 인터넷에서 다운 받았는데, 나중에 페이지를 찾을려고 하니, 시간이 지난 뒤여서  찾지 못하였습니다.

   그때 그때 북마크를 걸어두어야 하는데, 나중에 보니 못찾겠더군요.. 쩝.. )

파라미터를 바꾸어가면서 테스트 할 수 있도록 수정하였기 때문에

필터 효과를 눈으로 확인을 할 수 있습니다.

덕분에 TrackBar의 사용법도 알게 되었습니다.

궁굼하신 분은 코드를 보시면 쉽게 이해가실 것입니다.

아래 그림은 실행시켰을때 나오는 그림입니다.

사용자 삽입 이미지
트랙바가 2개인데 위 트랙바는 필터의 종류를

두번째 트랙바는 필터의 인자를 뜻합니다.

프린트로 덤프하므로 하나씩 움직여가면서 테스트 해보시면 쉽게 결과를 보실 수 있습니다.


Smooth

OpenCV에서는 몇가지 방법으로 Smooth를 할 수 있게 하여 줍니다.

함수의 원형은 다음과 같습니다.

void cvSmooth( const CvArr* src, CvArr* dst,

               int smoothtype=CV_GAUSSIAN,

               int param1=3, int param2=0, double param3=0 );


smoothing 타입에 따라서 파라미터 인자의 역활이 바뀝니다.

요 부분만 알고 있으면 나머진 쉽습니다.

src

원본 이미지


dst

결과 이미지


smoothtype

smoothing 타입

  • CV_BLUR_NO_SCALE (simple blur with no scaling)
    • summation over a pixel param1×param2 neighborhood.
    • If the neighborhood size may vary, one may precompute integral image with cvIntegral function.
  • CV_BLUR (simple blur)
    • summation over a pixel param1×param2 neighborhood with subsequent scaling by 1/(param1param2).
  • CV_GAUSSIAN (gaussian blur)
    • convolving image with param1×param2 Gaussian kernel.
  • CV_MEDIAN (median blur)
    • finding median of param1×param1 neighborhood (i.e. the neighborhood is square).
  • CV_BILATERAL (bilateral filter)


param1

첫번째 인자

param2

두번째 인자

In case of simple scaled/non-scaled and Gaussian blur if param2 is zero, it is set to param1.

param3

         가우시안 방식일 경우 시그마를 넣어야 하지만,

이 파라미터가 0이면 커널 사이즈에서 자동으로 만들어진다.  수식은 아래와 같습니다.

              sigma = (n/2 - 1)*0.3 + 0.8,

                  where n=param1 for horizontal kernel,

                                                

                        n=param2 for vertical kernel.


  • Using standard sigma for small kernels (3×3 to 7×7) gives better speed.
  •       If param3 is not zero, while param1 and param2 are zeros, the kernel size is calculated from the sigma (to provide accurate enough operation).

보통의 시그마를 쓸 경우 그냥 좀 빨라진다. (차이는 ???)

         - 사실 차이라는게 크게 없는듯 합니다. 많이 하면 차이가 있겠지만 제 머쉰에서는 금방 결과가 나왔습니다.

         커널 사이즈를 안주고 (0으로 주고) 호출하면 역으로 시그마에서 커널 사이즈를 만듭니다.


The function cvSmooth smooths image using one of several methods. Every of the methods has some features and restrictions listed below

Blur with no scaling works with single-channel images only and supports accumulation of 8-bit to 16-bit format (similar to cvSobel and cvLaplace) and 32-bit floating point to 32-bit floating-point format.

Simple blur and Gaussian blur support 1- or 3-channel, 8-bit and 32-bit floating point images. These two methods can process images in-place.

Median and bilateral filters work with 1- or 3-channel 8-bit images and can not process images in-place.


아래는 소스 코드입니다.


#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <errno.h>


#include <opencv/cv.h>

#include <opencv/highgui.h>




int g_switch_value = 0;

int sigma_value  = 0;

int filterInt = 0;

int lastfilterInt = -1;

int lastsigma = -1;


void switch_callback( int position ){

filterInt = position;

}


void switch_sigma_callback( int position ){

  if(position < 3 )

    position = 4;


  sigma_value = position;

}



int main(int argc, char * argv[])

{

const char* name = "Filters Window";

float f_sigma ;

IplImage* img = cvLoadImage( "4390m.jpg",1 );

IplImage* out = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 3 );


cvNamedWindow( name, 1 );

cvShowImage(name, out);

// Other Variables

CvPoint seed_point = cvPoint(305,195);

CvScalar color = CV_RGB(250,0,0);


// Create trackbar

cvCreateTrackbar( "FILTER", name, &g_switch_value, 5, switch_callback );

cvCreateTrackbar( "parameter", name, &sigma_value, 11, switch_sigma_callback );


while( 1 ) {


switch( filterInt ){

case 0:

 cvSmooth( img, out, CV_BLUR, 7, 7 , 0 ,0 );

break;

case 1:

 f_sigma = ( sigma_value / 2 - 1 ) * 0.3 + 0.8 ;

 cvSmooth( img, out, CV_GAUSSIAN, 7 , 7 , f_sigma , f_sigma);

 

break;

case 2:

 if( sigma_value < 3 )  sigma_value = 3 ;

 if( sigma_value % 2  == 0)  sigma_value +=1 ;

 cvSmooth( img, out, CV_MEDIAN,  sigma_value  ,  sigma_value , 0 , 0);

 break;

case 3:

cvErode( img, out, NULL, 1);

break;

case 4:

cvDilate( img, out, NULL, 1);

break;

case 5:

cvFloodFill( out, seed_point, color, cvScalarAll(5.0), cvScalarAll(5.0), NULL, 4, NULL );

break;

}


if(

  (filterInt != lastfilterInt)||

  (sigma_value != lastsigma)

 )

 {

cvShowImage(name, out);

lastfilterInt = filterInt;

lastsigma     = sigma_value;


switch( filterInt ){

   case 0:

     printf("Blur Smooth\n");

     break;

   case 1:

     printf("Gaussian Smooth\n");

       printf(" Sigma %d\n",  sigma_value );  

     break;

   case 2:

     printf("Median Smooth : Filter Size = %d x %d\n" , sigma_value , sigma_value);

     break;

   case 3:

     printf("Erode\n");

     break;

   case 4:

          printf("Dilate\n");

     break;

   case 5:

       printf("Flood Fill\n");

     break;

           }

 }


if( cvWaitKey( 15 ) == 27 )

break;

}


cvReleaseImage( &img );

cvReleaseImage( &out );

cvDestroyWindow( name );

return 0;

}





'Computer Vision' 카테고리의 다른 글

OpenCV - Alpha Blending cvAddWeighted , cvFillPoly  (2) 2009.04.25
JPEG2AVI 를 맥에서 빌드하기  (0) 2009.04.24
Rob Hess의 SIFT [6]  (0) 2009.04.18
OpenCV - Convert Image  (0) 2009.04.11
OpenCV - Image Mask  (0) 2009.03.16
Posted by GUNDAM_IM
Computer Vision2009. 4. 18. 15:08

() 글을 읽기 전에
글은 저와 같은  초보자를 위해서 정리하는 것입니다.
전문가시라면 굳이 읽을 필요가 없습니다.
공부하면서 정리하는 글이라서 서툰 부분이 많이 보입니다. 이해하여 주시고

틈틈이 새로운 것을 알게 되면 그때 그때 업데이트 하겠습니다.



(주) 시작하기 전에

실제 코드를 한번 따라가기 전에 SIFT 알고리즘을 간략하게 정리하여둡니다.

코드를 기계적으로 따라가는것 보다는 알고리즘을 이해하고 따라가는 것이 유용하기 때문입니다.

물론 그렇다고 제가 알고리즘을 다 이해하는 것은 아닙니다.

그냥 초보 수준에서 아는 것들만 정리하였습니다.



PPT 발표 자료는 이 페이지를 참조 하세요 : SIFT정리.ppt

발표자료를 기반으로 하여서 추가적으로 정리한 내용입니다.



1. Harris Corner Detector

특징으로는 다음과 같습니다.

  Rotation 에 대해 검출이 가능하다.

  부분 이미지로도 검출이 가능하다.

{

해석 :

이상의 말을 풀이하면

H.C.Detector는 영상이  회전된 것 그리고 밝기의 변화와 이미지 상에서 노이즈가 있어도

어느정도 이를 견디어 내며 원하는 포인트를 찾아낼 수 있다는 의미가 됩니다.

H.C.Detector는 Local Auto Correlation Function에 기반합니다.

기본적인 아이디어는 전체 이미지를 한방에 뒤지는 것이 아니고

주어진 이미지 영역에서 작은 이미지 영역 (부분 영역)을 설정하여 이 윈도우를 주변 영역과 비교하여

커다란 차이점이 있는 부분을 찾아내는 방식입니다.

설정된 이미지에 대해서 뒤지는 방향은 아무 방향이나 상관이 없습니다. 다만 주어진 부분 영역에 대해서

큰 변화가 생기는 방향으로 이동해야 하곘지요


아래 그림을 보면 쉽게 이해됩니다.


사용자 삽입 이미지

 

제일 왼쪽 그림은 뒤져서 변화가 없으므로 “Flat”으로 보게 됩니다.

가운데 그림은 상하로만 선분이 있다는 것을 알게 됩니다.

- 에지 방향으로 변화가 없다는 것은 에지가 존재한다는 의미가 됩니다.

오른쪽 그림은 모든 방향으로 변화가 존재하기 때문에

“Conor”라고 보는 것 입니다.


- 수학적인 의미는 다음에 하기로 하고 여기선 패스 합니다.

- SIFT가 우선이므로, H.C.Detector는 이정도에서 정리합니다.


매트랩에 대한 코드는 아래를 참고하시기 바랍니다.

http://ipl.cnu.ac.kr/mayadata/harris/harris_corner_detector.htm


}


사용자 삽입 이미지

상기 그림을 실제 H.C.Detector에 걸면 다음과 같은 영상을 얻을 수 있습니다.

사용자 삽입 이미지


그리고 이 그림의 임계치 이상만을 검출하면 다음과 같습니다.


사용자 삽입 이미지


임계치 이상 영역에서 최대값만을 표시하면 다음과 같습니다.

사용자 삽입 이미지

요것이 바로 코너 포인트가 되는 것입니다.


  이 코너포인트를 원본 그림과 매핑하면 다음과 같습니다.


사용자 삽입 이미지

문제점 :

크기 변화에대해 대처하지 못한다.

사용자 삽입 이미지
위의 그림처럼 원래 에지로 인식하는 것이 크기가 줄어들면서 Coner로 인식이 되는 경우가 발생합니다.

혹은 그 역으로도 발생합니다.


따라서 H.C.Detector는 크기의 변경에 따라서 검출되는 정보가 변하므로,

        크기 변화에 대처하지 못하는 것입니다.

   

       SIFT는 이러한 문제점을 개선하기 위해서 나온 것입니다.

       본격적인 이야긴 다음편에서~~      



    이번 내용에 대해서 추가적인 자료는 다음과 같습니다.


      매트랩등등의 코드를 함께 제공하기 때문에 공부하실 분들은 이 페이지를 참고하여 주세요


http://ipl.cnu.ac.kr/mayadata/harris/harris_corner_detector.htm

그리고 위에 설명에 사용된 그림과 수식등은


lect9-slides.pdf


      을 참고하시기 바랍니다.


      ----------

      자료 정리하던 프로그램이 Expire되어 버렸습니다.

      잘 정리(?) 된 줄 알았는데 근본적으로 Time Limit이 되어 있더군요

      좋은 프로그램인데 넘 고가여서.. .쩝..


      그래서 한단계 낮은 프로그램을 구입했습니다.

      그바람에 그동안 정리했던 것 옮기느라 많이 늦어졌네요

      

'Computer Vision' 카테고리의 다른 글

JPEG2AVI 를 맥에서 빌드하기  (0) 2009.04.24
OpenCV - cvSmooth  (2) 2009.04.22
OpenCV - Convert Image  (0) 2009.04.11
OpenCV - Image Mask  (0) 2009.03.16
OpenCV - Extract  (2) 2009.03.12
Posted by GUNDAM_IM
Animation2009. 4. 16. 15:22
자료를 정리하다가 대학교 4학년 때에 작성하였던 레포트를 발견하였습니다.
강사가 자신이 가장 관심있는 분야에 대해서 레포트를 제출하라고 해서
가장 관심있었던 (그리고 지금도 관심이 있는) 에니메이션에 대해서 정리한 레포트입니다.

물론 점수야 잘 받았습니다.

푸훗..

GUNDAM

---------------------------------------------------------------------------------------------------------

銀河鐵道 999를 다시 보며..

       인간이 이 세상에 태어나기 전부터 별은 빛나고 있었다.
    인간이 이세상을 떠난 뒤에도 별은 그 빛을 잃지 않을 것이다.
살아있는 동안 인간은 별의 바다를 올려 보며 스스로의 여로를 생각한다.

 나는 애니메이션 소위 만화영화를 아주 좋아한다. 그 중에서도  銀河鐵道 999를 가장 좋아한다. 끝난지 10여년이 넘어가는 아주 고전에 속하는 작품이지만 요 근래 나오는 웬만한 애니메이션에서는 느끼지 못하는 그런 감동을 가지고 있다. 가장 미래적인 배경과 무대에서 가장 서정적인 면, 인간적인 면을 그리고 있다.  999의 무대는 물론 별의 바다이다.

 銀河鐵道 999(쓰리 나인으로 읽는다.)에서는 경원의 대상인 별의 바다를 여행하며 그 속에 있는 여러 가지를 다른 삶을 보여주고 있다.  주인공 철이는 그 시대의 절대 가치가 된 무한한 생명을 가질 수 있는 기계 몸을 얻기 위해 자신을 새로운 바다로 안내하는 메텔이라는 여성과 함께 여행을 떠난다.  그리고 그 곳에서 여러 가지 생물 혹은 무생물의 슬픔과 기쁨, 사랑과 미움을 보며 한 사람의 진실한 인간으로 성장하게 된다.

  그리고  마침내 경원의 대상이었던 무한한 생명의 기계 몸이 아니라 유한한 생명을 가졌지만 무한한 가능성의 참된 인간으로 남는 것을 택하게 된다.  이러한 것은 작가가 여행하는 별들 하나하나에 의미를 두고 그렸으며 그러한 의미를 소년의 눈을 통하여 관객들에게 전달 하고 있었고 참된 인간으로서의 가치를 보여주고 있는 것이다.

 별의 바다에서 벌어지는 모든 일들을 알고 있는 안내자로서의 메텔은 철이에게 수많은 이야기를 들려주고 배우게 하여 준다. 하지만 자신의 참모습 만은 보여주지 않는다. 아니 어쩌면 그것은 관객들은 물론 작가 자신도 형상화 시킬 수 없는 그런 이미지를 가지고 있기 때문일 것이다. 그것은 결코 전지 전능한 신의 이미지도 천사의 이미지도 아니라 바로 거친 바다와 같은 인생을 살아온 사람 아니면 먼 여행에서 돌아온 뱃사공과 같은 이미지를 지니고 있다.  때문에 사람들은 메텔을 소년시절의 꿈을 여행하는 여자 청춘의 환상을 여행하는 여인 이라고 부른다.그녀는 유한한 생명과 무한한 가능성의 인간을 선택한 철이를 뒤로 하고 다시 새로운 소년을 데리고 별의 바다로 다시 떠난다.  울고 있는 철이를 태운 999은 메텔을 태운 또 다른 999과 별의 바다를 영원히 평행선을 그리며 나갈 뿐이었다.

 작가 마스모토 레이지는 철이라는 캐릭터를 통해서 한없는 별의 바다를 여행하는 모습을 보여준다. 그 곳에는 사람들이 갈구하던 영원에의 성취도 신화에 나오는 소명에 대한 성취의 결과도 없다. 단지 광활한 인생의 새로운 바다를 헤쳐나가야 할 부름만이 있을 뿐이었다.  그 운명의 바다를 노련한 뱃사공의 안내로 헤쳐나가고 있었고 마침내 스스로 헤쳐나갈 수 있게 되었을 때 그 뱃사공은 새로운 소명을 가지고 떠나가는 것이다.  

 이러한 것은 뒤이은 최종 편에서 확연하게 보여준다.  우여 곡절 끝에 철이는 메텔과 다시 만나게 되지만 새로운 소명이 끝나게 되었을 때  메텔은 다시 철이 곁을 떠나게 된다.  역에서 스쳐 지나가는 창을 통하여 뒤에 남아있는 메텔의 모습을 본 철이는 다시 메텔과 헤어져야 하는 운명임을 깨닫게 된다.  하지만 결코 처음처럼 울지는 않는다. 철이는 어느덧 어른이 된 것이다.  

여기에서 등장하는 기차역은 여러 가지 의미를 부여 받았다  이야기의 시작과 끝 혹은 또 다른 이야기의 시작을 의미 하며, 도착과 발착의 기점의 의미 외에도 사랑하는 사람들을 뒤로 한 채 떠나가야 하는 사람들의 마음이 있는 곳, 현재의 삶에서 한 단계 더 나은 삶으로의 탈출 혹은 상승 출구로서의 의미를 지니기도 했다. 그러한 것 외에도 역은 여행의 최종 목적지라고 할 수 있는 안식의 땅을 나타내기도 하였다. 결코 크지도 않는 작은 시골역을 통하여 작가는 아련한 추억의 고향 역을 보여 주려고 노력했었다  과연 얼마나 많은 사람들이 조그마한 역을 통해서 삶의 바다를 여행하고 있을까 ?  

 늙은 뱃사공이 바다를 향해 꿈을 키우는 소년에게 말하는 것처럼 세상에는 많은 바다가 있다. 그리고 그 바다에는 더욱 많은 파도와 태풍 그리고 역이 있을 것이다.  그리고 그 바다에는 늙은 뱃사람과 같은 안내자가 있을 것이고 그 바다 너머에는 그 누구도 가보지 못한 무한한 새로운 바다가 있을 것이다.

 최종 편  "사요 나라 銀河鐵道999" 의 마지막 장면은 그 장면을 본 사람만이 느낄 수 있는 그런 느낌을 가졌다. 수많은 별들을 여행한 사람들만이, 청춘의 환상을 경험한 사람들만이, 소년시절의 꿈을 가진 사람들만이, 새로운 바다로 떠나가는 뱃사람만이 지을 수 있는 표정을 주인공의 얼굴에 그린 작가에게 별의 바다와 같은 경의를 표할 수 밖에 없었다.

'Animation' 카테고리의 다른 글

다시보는 Z 건담  (1) 2011.03.15
건담 팬들을 위한 부천 판타스틱 영화제  (2) 2010.05.26
강식 장갑 가이버 2005  (0) 2009.12.01
건담 강림..  (0) 2009.06.17
막장 기어스 드디어 다 보다  (0) 2009.01.03
Posted by GUNDAM_IM
Computer Vision2009. 4. 11. 17:41

OpenCV Convert Image


() 글을 읽기 전에
글은 저와 같은 OpenCV초보자를 위해서 정리하는 것입니다.
전문가시라면 굳이 읽을 필요가 없습니다.
공부하면서 정리하는 글이라서 서툰 부분이 많이많이 보입니다.


영상 처리를 하기 위해서는 때때로 컬러 공간을 바꾸어 줘야 할 때가 많습니다.

영상에서 필요한 정보를 찾아서 추출하기 위해서는 RGB공간에서 얻을 수 없는 정보를

다른 컬러 공간에서 얻어낼 수 있기 때문입니다.

예를들어서 사진에서 휘도를 바꾸고 싶을 경우

YCbCr로 바꾼후에 Y를 변경하고 다시 이것을 RGB로 바꾸는 과정을 거치게 됩니다.

이럴 경우 컬러 공간을 변환하는 함수가 있어야 하는데

OpenCV에서는 아래 함수가 그 동작을 도와줍니다.

cvCvtColor( 입력 이미지 , 출력 이미지 , 옵션 ); 


옵션은 아주 많이 있지만 아래에 몇가지 중요한 옵션을 설명하였습니다.


  CV_RGB2GRAY  : 흑백으로 바꾸기

                            수식은 다음과 같다.

RGB[A]->Gray: Y<-0.299*R + 0.587*G + 0.114*B


  CV_RGB2YCrCb : YCrCb로 바꾸기

    Y <- 0.299*R + 0.587*G + 0.114*B

  Cr <- (R-Y)*0.713 + delta

  Cb <- (B-Y)*0.564 + delta


  CV_RGB2HLS    : ( Hue Lightness Saturation ) 으로 변환한다.

   // In case of 8-bit and 16-bit images

  // R, G and B are converted to floating-point format and scaled to fit 0..1 range

  V,,max,, <- max(R,G,B)

  V,,min,, <- min(R,G,B)

  L <- (V,,max,, + V,,min,,)/2

  S <- (V,,max,, - V,,min,,)/(V,,max,, + V,,min,,)  if L < 0.5

        (V,,max,, - V,,min,,)/(2 - (V,,max,, + V,,min,,))  if L = 0.5

           (G - B)*60/S,  if V,,max,,=R

  H <- 180+(B - R)*60/S,  if V,,max,,=G

        240+(R - G)*60/S,  if V,,max,,=B

  if H<0 then H<-H+360

  On output 0=L=1, 0=S=1, 0=H=360.

  The values are then converted to the destination data type:

      8-bit images:

           L <- L*255, S <- S*255, H <- H/2

      16-bit images (currently not supported):

          L <- L*65535, S <- S*65535, H <- H

      32-bit images:

          H, L, S are left as is


  CV_RGB2HSV : RGB 값을 HSV로 바꾼다. HSV란 Hue Saturation Value를 의미한다.


  // In case of 8-bit and 16-bit images

  // R, G and B are converted to floating-point format and scaled to fit 0..1 range

  V <- max(R,G,B)

  S <- (V-min(R,G,B))/V   if V?0, 0 otherwise

           (G - B)*60/S,  if V=R

  H <- 120+(B - R)*60/S,  if V=G

       240+(R - G)*60/S,  if V=B

  if H<0 then H<-H+360

  On output 0=V=1, 0=S=1, 0=H=360.

  The values are then converted to the destination data type:

      8-bit images:

          V <- V*255, S <- S*255, H <- H/2 (to fit to 0..255)

      16-bit images (currently not supported):

          V <- V*65535, S <- S*65535, H <- H

      32-bit images:

          H, S, V are left as is

  CV_RGB2Lab : CIE Lab Color로 변환한다.

  // In case of 8-bit and 16-bit images

  // R, G and B are converted to floating-point format and scaled to fit 0..1 range

  // convert R,G,B to CIE XYZ

  |X|    |0.412453  0.357580  0.180423| |R|

  |Y| <- |0.212671  0.715160  0.072169|*|G|

  |Z|    |0.019334  0.119193  0.950227| |B|

  X <- X/Xn, where Xn = 0.950456

  Z <- Z/Zn, where Zn = 1.088754

  L <- 116*Y^1/3-16      for Y>0.008856

  L <- 903.3*Y           for Y<=0.008856

  a <- 500*(f(X)-f(Y)) + delta

  b <- 200*(f(Y)-f(Z)) + delta

  where f(t)=t^1/3^              for t>0.008856

        f(t)=7.787*t+16/116   for t<=0.008856

  where delta = 128 for 8-bit images,

                0 for floating-point images

  On output 0=L=100, -127=a=127, -127=b=127

  The values are then converted to the destination data type:

      8-bit images:

          L <- L*255/100, a <- a + 128, b <- b + 128

       16-bit images are currently not supported

       32-bit images:

          L, a, b are left as is


  •   CV_RGB2Luv  CIE Luv Color로 변환한다.

  // In case of 8-bit and 16-bit images

  // R, G and B are converted to floating-point format and scaled to fit 0..1 range

  // convert R,G,B to CIE XYZ

  |X|    |0.412453  0.357580  0.180423| |R|

  |Y| <- |0.212671  0.715160  0.072169|*|G|

  |Z|    |0.019334  0.119193  0.950227| |B|

  L <- 116*Y^1/3^      for Y>0.008856

  L <- 903.3*Y      for Y<=0.008856

  u' <- 4*X/(X + 15*Y + 3*Z)

  v' <- 9*Y/(X + 15*Y + 3*Z)

  u <- 13*L*(u' - u,,n,,), where u,,n,,=0.19793943

  v <- 13*L*(v' - v,,n,,), where v,,n,,=0.46831096

  On output 0=L=100, -134=u=220, -140=v=122

  The values are then converted to the destination data type:

      8-bit images:

          L <- L*255/100, u <- (u + 134)*255/354, v <- (v + 140)*255/256

      16-bit images are currently not supported

      32-bit images:

          L, u, v are left as is


코드는 아래와 같습니다.


#include <stdio.h>

#include <unistd.h>

#include <string.h>

#include <errno.h>


#include <opencv/cv.h>

#include <opencv/highgui.h>


int main(int argc , char *argv[]){


  IplImage *imgB ;





  if (argc < 3 )

        {

                printf("usage : colorcvt.elf srcimage dstimage option \n");

                printf("      srcimage : source image file name\n");

                printf("      dstimage : destination image file name\n");

                printf("      option   : 0 : CV_RGB2GRAY \n");

                printf("                 1 : CV_RGB2YCrCb \n");

                printf("                 2 : CV_RGB2HLS \n");

                printf("                 3 : CV_RGB2HSV \n");

                printf("                 4 : CV_RGB2Lab \n");

                printf("                 5 : CV_RGB2Luv \n");

                exit(0);

        }


  // 이미지 읽기

  IplImage *imgA = cvLoadImage( argv[1] , 1);


  // 대상 이미지 확정

  switch( *argv[3] )

  {

   case '0' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 1);

              cvCvtColor(imgA , imgB , CV_RGB2GRAY );

              break;

   case '1' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

              cvCvtColor(imgA , imgB , CV_RGB2YCrCb  );

              break;

   case '2' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

              cvCvtColor(imgA , imgB , CV_RGB2HLS  );

              break;

   case '3' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

              cvCvtColor(imgA , imgB , CV_RGB2HSV  );

              break;

   case '4' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

              cvCvtColor(imgA , imgB , CV_RGB2Lab  );

              break;

   case '5' :

              imgB = cvCreateImage( cvGetSize( imgA), IPL_DEPTH_8U, 3);

              cvCvtColor(imgA , imgB , CV_RGB2Luv  );

              break;


  }



  cvNamedWindow("Converted Image",0);

  cvShowImage("Converted Image",(CvArr*)imgB);

  cvWaitKey(0);

  cvDestroyWindow("Converted Image");


  cvSaveImage( argv[2] , imgB);

  cvReleaseImage( &imgA );

  cvReleaseImage( &imgB );

  return 0;

}


아래는 각각의 옵션으로 했을때의 그림입니다.

컬러 스페이스가 틀린것을 강제로 출력한 형태이므로 다른 컬러 공간의 그림은 정확하게 표현되지는 않습니다. 그냥 이렇게 되었다는 것만 보면 될 듯 합니다.


원본 이미지


사용자 삽입 이미지


흑백으로 변환 이미지

사용자 삽입 이미지



사용자 삽입 이미지

사용자 삽입 이미지


사용자 삽입 이미지
사용자 삽입 이미지










'Computer Vision' 카테고리의 다른 글

OpenCV - cvSmooth  (2) 2009.04.22
Rob Hess의 SIFT [6]  (0) 2009.04.18
OpenCV - Image Mask  (0) 2009.03.16
OpenCV - Extract  (2) 2009.03.12
OpenCV - Image Rotation & Scale  (0) 2009.03.10
Posted by GUNDAM_IM
ASIC SoC2009. 4. 7. 07:57

아래에 관련된 글을 올렸는데요


이번에는 그냥 동작하는 사진을 올립니다.

AHB 버스를 통해서 FPGA보드를 구동하는 것입니다.

예상보다 쉽게 동작을 성공시켜서 기분이 좋습니다.


보드 색상도 맘에 들고,

사실 녹색 보드는 너무 평범하고, 맘에 안들죠


다음 보드 색상은 푸른색입니다.

"기가노스의 푸른매" 를 생각해서 선택할 색상입니다.

(혹 모르시는 분들은 메탈아머 드래고나를 보시기 바랍니다.)


이제 ARM Platform 만들때 프로세서 때문에 FPGA 테스트에서 고생할 일은

많이 줄어들것 같습니다.


통상 3배의 개발 편의성 (ㅋㅋ)


사용자 삽입 이미지

Posted by GUNDAM_IM
MAC Life2009. 3. 30. 13:52
이번에 드디어 17" Mac Book Pro를 입하 하였습니다.

그동안 산것을 세어보니 5번째네요

Apple-IIe -> Newton Message Pad 130 -> MAC Book Pro 15" 초기형 -> MAC PRO -> MAC BOOK PRO 17"

17"를 장만한것은 그동안 잘 사용하던 MAC BOOK PRO 15" 가 이제 3년의 보증기간이 끝났고,
무엇보다 그동안 차에서 떨어뜨리고, 애기들이 사뿐히 밟아주고, 비도 맞고, 책상 모서리에 찍히고 해서
성한 곳이 없는 외모에다가, 내부에 하드 바꾼다고 몇번이나 케이스를 열고 닫아서,
내부도 그닥 성한곳이 없습니다.

항상 재조립을 하면 나사가 한두개 남더라구요 (^___^)

그래서 새로 장만해야겠다고 생각하고 있었고 Air를 고려했지만,
서브 노트북은 예전에도 써봤는데 성능이나 모든면에서 그렇게 땅기지가 않아서 이번는 아예 커다란 사이즈로 가기로 했습니다.

암튼 항상 느끼는 것이지만 애플이 좋은것은 15" 버전이 3년이 넘었는데도 아직도 새로운 프로그램을 올려도 그렇게 성능이 부족하다는 느낌이 하나도 들지 않습니다. 처음이나 지금까지도 아무런 문제가 없이 잘 쓸 수 있다는 점이 강점이고, Apple Care에 등록하면 3년간은 거의 1:1 무상으로 서비스를 받기 때문에 편리합니다.

집에있는 책상에는 Message PAD 130 이 있습니다.  , 최초의 PDA씨리즈 입니다.
애플이 스컬리 (X파일이 아닙니다.) 사장 시절에 의욕적으로 추진한 제품인데, 결국 시대를 쪼끔 앞서간 느낌으로 망한 제품이지요. 물론 아직도 잘 동작합니다. 배터리 새거로 넣으면 잘 동작해요.. 요샌 쓰지 않아서 고이 책상위에 모셔놓았습니다. 가끔 큰넘이 노리기는 하지만, 그냥 장난감 핸드폰인줄 알고 있습니다. 디보 컴퓨터보다 작고 또 무겁고,  핸드폰 보다는 크다고 싫어합니다

구형과 신형에서 바뀐점은

    프로세서가 좀더 좋아진점하고
    메모리가 4G로 바뀌었다는점
      - 2G는 자이링스 ISE도 잘 못돌리는 메모리여서 고생이 많았습니다.
    팬의 소음이 좀 쎄졌다는것..
    그리고 마우스 트랙패트에 버튼이 트랙패드 자체로 대치되어서 그 밑으로 숨었다는 점
    애플의 자랑 멀티터치가 지원된다는 점 - 우훗.. 디따 큰 아이팟 같습니다.
    -  이거 물건입니다. PT할때 이걸로 그림 보여주고, 회전 확대를 하면,
       보는 사람들이 빨려들어갑니다.
    무게가 좀더 무거워져서 어깨가 아플것 같다는 점

 등입니다.
 
17" 제품은 좀더 써보고 (시간이 나면) 사용 후기를 올리도록 하곘습니다.


'MAC Life' 카테고리의 다른 글

맥에서 프로파일링 하기  (0) 2009.06.18
OSX용 YUV Player 입니다.  (0) 2009.06.16
맥에서 개발한다는 것은..  (0) 2009.03.19
수치스러운 인터페이스의 명예의 전당  (0) 2009.03.05
Culture Code의 개발 이미지  (0) 2009.01.28
Posted by GUNDAM_IM
ASIC SoC2009. 3. 26. 07:49

이번에 칩을 하나 만들면서 SilverChip 기능을 넣었습니다.


ARM926-EJS로 여러가지 기능을 많이 넣어서 만들었습니다만,


그중에 백미는

 Graphic Accelerator 와

 SilverChip기능입니다.


Silver Chip이란 프로세서 Core와 그 Core의 AHB버스가 밖으로 나와서 동작하는 Chip입니다.

내부에서는 ARM926 Core와 약간의 Glue Logic이 들어간 것입니다.

ARM사에서 제공하는 CoreTile B/D의 칩을 생각하시면 맞습니다.


이번에 개발한 칩은 본래 목적은 그래픽/미디어 처리 프로세서이지만

그 외에도 내부 개발용으로 사용하기 위해서 Silver Chip 기능을 추가해서 만든 것입니다.


보드를 만들때,  "그분" 전용으로 만들려고 붉은색으로 PCB를 만들었습니다.

패키지도 "그분" 전용 답게 붉은색으로 하면 좋지만, 검정색 밖에 없어서 아쉽습니다.

물론 통상 3배의 속도로 동작하지는 않습니다. (^^)


멋질거라 생각했고 나온 보드 색상도 나름 괜찮은데,


보드 색상에 대해서 결과물을 보고 멤버들이 비난아닌 비난을 조금 해서..

맘 상했습니다. 쩝..

아직도 건담의 로망을 모르다니..


AHB에 대한 테스트와 , SoC Chip의 프로토 타입 FPGA 검증 등, 보드 개발시에 편리성 등을 따져보면,

통상 3배의 (속도가 아니고) 개발 편의성을 자랑할 수 있습니다.ㅋㅋ


아래에 사진을 올립니다


사용자 삽입 이미지

밑에 있는 보드는 자체 개발한 프로토 타입 보드입니다.

그동안 프로토타입 보드를 3개를 개발했는데 그중 3번째보드입니다.

Virtex 5 제일 큰것이 2개 들어간 막강 보드입니다.


사용자 삽입 이미지

이것이 마지막 프로토타입보드가 되었으면 하는데 Virtex6가 가을에 나오고

용량이 Virtex5의 2배가 된다고 하니


나중에는 그분 전용 프로토 타입보드를 개발해야 하지 않을까 합니다.


아니면 그때는 GOLD로 해볼까요 ? KOG를 고려해 봐야하지 않을까 생각합니다.

그럼 파티마도  필요할텐데~

Posted by GUNDAM_IM