2008. 10. 3. 21:04

표준화 문제

현재 컬러코드의 작성 표준화가 아무곳에도 나와 있지 않다..

 


 

다만..위 사진으로 보아...D11~D44와 P1r.c..그리고 Pra가

 

있다...P1r.c...은 각각 4가지 색을 기본으로 하여..

 

4개영역...총 256개의 정보를 저장한다...

 

....

 

물론 25개 영역을 모두 사용하면 그 양은 엄청나겠지만..

 

그렇게 되면 표준화의 의미가 없어지고..검색이 어려우러 것이다.

 

..

 

..

 

자료에 보면 5×5 매트릭스의 경우 표현 가능한 주소공간이

 

32비트로 40억개 이상의 데이터를 관리한다고 했다..

 

위에 처럼 D11~D44까지 총 16개 영역을 4개 색깔로 표현하니까.

 

4*4*4*4*4*4*4*4*~~~해서 총 16번 곱하면 된다..

 

그럼 값은..4294978296..약 42억으로 위에 내용과 맞아 떨어진다..

 

또 다양한 매핑(mapping) 기법을 도입하면 170억개 데이터까지

 

확장이 가능하다고 했는데..

 

이건 아마도 다른 영역과는 관련이 없는거 같다...아니면

 

위에 그림과 달리..

 

조금 형태를 바꾸는 것을 말하는 것일지도 모른다.

 

 

 

그럼 나머지 영역은 뭐를 뜻하는 걸까??

 

제품의 종류?...국가?...등급?..을 뜻하는 것일 텐데..

 

그럼 먼저 인식한 값을 이진화나..아니면 다른 실수형?정수형?의

 

숫자 나타내고..그 값을 토대로..DB가 이 나머지 영역의 정보를

 

이용하여 좀더 신속하게...찾을 수 있을 것이다..

 

40억개나 하는 정보를 어느 세월에 검색하겠나..??..

 

어떤 방식으로 되어있지???? 좀 더 찾아 봐야 할꺼 같다..


2008. 10. 3. 21:03

↓ 최종 확인...



 

보기 쉽게 할려고 좀 신경 써따...문제는 인식하는 법이 맞느냐인데.

 

일단 템플릿으로 하여 만들고 있다...패턴인식을 해야되는데..

 

어디부터 시작해야 할지..모르겠다...

 

 

<해결한 점>

일단 바로 밑에 소스에서 많이 보완을 하고 추가를 했는데..

 

position[5][5]전에 [4][4]로 했는데..

 

계속 끝에 [2][1]값이 각 배열 끝에 들어 갔다..그래서..

 

아예~[5][5]로 해서 해결했다...ㅡㅁㅡㅋㅋㅋ

 

그리고

 

원본이미지에서 찾은 컬러코드의 원도우에서의 시작좌표와 끝 좌표

 

인식한 컬러코드가 5*5라 가정하고 5분활하여 25개영역으로 나눈뒤

 

그 하나영역의 길이를 구하여..전체 25등분구역을 제어할 수 있었다

 

 

[추가]

 

추가한거는 색을 판단해서...무슨색인지 알아내는 건데..

 

이건 그냥 기본적인 OpenCV함수로 만든거다..

 

실제로 만들때는 알고리즘을 따로 만들어야 한다..

 

 

소스는 바로 위에 올리겠음...

 

PS. 본 자료와 컬러코드 그림은

      http://www.colorzip.co.kr에 저작권이 있어 상업적으로

      이용할 수 없음... 배포 하지 말 것...

 

그리고 다시 실행하니..색인식이 제대로 안되는데..그거는 뒤에 로테이션소스참조

2008. 10. 3. 21:02

매트릭스 25영역 배열저장 및..출력



Release-tkss8329.zip 

void CPracticeDlg::OnButton2()
{
 UpdateData(TRUE);   
    
 int xx,yy;                  // 읽을 좌표값 저장...
     xx=m_strx-1;
     yy=m_stry-1;

 

 if(m_strx!=0 && m_stry!=0 && m_strx<=5 && m_stry<=5){
 

 IplImage* src=cvLoadImage("11.jpg",1);
 IplImage* src2=cvLoadImage("33.jpg",1);
 IplImage* dst_image=cvCreateImage(cvSize(src->width-src2->width+1,src->height-src2->height+1),IPL_DEPTH_32F,0);
 

 IplImage* dst2=cvCloneImage(src);    
 IplImage* frame_copy2 = cvCreateImage( cvSize(src->width,src->height),IPL_DEPTH_8U, src->nChannels );
 IplImage* frame_copy = cvCreateImage( cvSize(src->width,src->height),IPL_DEPTH_8U, src->nChannels );

 

 if( src->origin == IPL_ORIGIN_TL ) {//Top-Left Origin
    cvCopy( src, frame_copy2, 0 );
    cvCopy( src, frame_copy, 0 );
   }else{
    cvFlip( src, frame_copy2, 0 );
    cvFlip( src, frame_copy, 0 );
   }
 
    
  //상관계수를 이용하여 템플릿 매칭
 cvMatchTemplate(src,src2,dst_image,CV_TM_CCOEFF_NORMED);

 double min_val, max_val;
 CvPoint max_val_pos, pos;
 cvMinMaxLoc(dst_image, &min_val, &max_val, NULL, &max_val_pos);  // 유사도가 최대인 위치 얻음


 pos.x = max_val_pos.x + src2->width;
 pos.y = max_val_pos.y + src2->height;

 

  int aa,bb,result_x,result_y;
   aa=pos.x - max_val_pos.x;
   bb=pos.y - max_val_pos.y;
   result_x=aa/5;
   result_y=bb/5;

//   CString assd;         //인식한 이미지 시작원도우좌표
//      assd.Format("%d,%d",result_x,result_y);
//   AfxMessageBox(assd);
     

 

// ======================================================   

   for(int q=0; q<5; q++){
    for(int w=0; w<5; w++){

        // position[5][5]는 CPoint형으로 전역변수로 선언

        // NULL값 자리까지 확보하여 [5][5]
        position[q][w].x=max_val_pos.x+(result_x*w);
        position[q][w].y=max_val_pos.y+(result_y*q);
//     CString asd;
//     asd.Format("%d,%d",postion[q][w].x,postion[q][w].y);
//     AfxMessageBox(asd);
    }
   }
           
 //======================================================
           

 

// 매트릭스 5*5 전체인식

  IplImage* roi_image=cvCreateImage(cvSize(src2->width,

                      src2->height),src2->depth, src2->nChannels );
  CvRect rect = {max_val_pos.x, max_val_pos.y, src2->width,

                      src2->height};
  cvSetImageROI(frame_copy2, rect);

 


// 매트릭스 25영역 부분 인식
  IplImage* roi_image2=cvCreateImage(cvSize(result_x,

                      result_y), src2->depth, src2->nChannels );
  CvRect rect2 = {position[xx][yy].x, position[xx][yy].y,

                       result_x, result_y};
  cvSetImageROI(frame_copy, rect2);

  cvResize (frame_copy2, roi_image, CV_INTER_LINEAR);
  cvResize (frame_copy, roi_image2, CV_INTER_LINEAR);


 cvNamedWindow("template", CV_WINDOW_AUTOSIZE);
 cvShowImage("template", roi_image2);
 cvNamedWindow("dest2", CV_WINDOW_AUTOSIZE);
 cvShowImage("dest2", roi_image);
 cvReleaseImage(&roi_image);

 }else{
  AfxMessageBox("출력할 매트릭스 좌표를 입력하세요.");
 }
}

 

PS. 에디터변수값이...왜?

       CV메인 함수내에 들어가면 값이 변하지??

2008. 10. 3. 21:01

↓ 영상으로 확인


//Sobel
 if(m_Mode == Sobel)
 {
      
  
    IplImage* src3=cvLoadImage("3.jpg",1);
    IplImage* dst_image3;
    IplImage *frame_copys = 0, *frame_copys2 = 0;
         
      
    if( !frame_copys )
    frame_copys = cvCreateImage( cvSize(image->width,
             image->height),IPL_DEPTH_8U, image->nChannels );
  
    frame_copys2 = cvCreateImage( cvSize(image->width,
             image->height),IPL_DEPTH_8U, image->nChannels );
           
    
   // Windows의 Bitmap 스타일은 영상의 Bottom-Left가 (0,0)에 온다
   if( image->origin == IPL_ORIGIN_TL ) {//Top-Left Origin
                cvCopy( image, frame_copys, 0 );
                cvCopy( image, frame_copys2, 0 );
   }else{
                cvFlip( image, frame_copys, 0 );
                cvFlip( image, frame_copys2, 0 );
   }
        
         //상관계수를 이용하여 템플릿 매칭
         dst_image3=cvCreateImage(cvSize(frame_copys->width-src3->width+1,frame_copys->height-src3->height+1),IPL_DEPTH_32F,0);
 
   cvMatchTemplate(frame_copys,src3,dst_image3,CV_TM_CCOEFF_NORMED);
        
 
         double min_val, max_val;
         
         CvPoint max_val_pos, pos;
           
         cvMinMaxLoc(dst_image3, &min_val, &max_val, NULL, &max_val_pos);  // 유사도가 최대인 위치 얻음
           
         pos.x = max_val_pos.x + src3->width;
         pos.y = max_val_pos.y + src3->height;
           
        //    cvRectangle(image, max_val_pos, pos, CV_RGB(255,0,0));
   // 인식한 영상부분 만 출력
   int aa,bb,result_x,result_y;
   aa=pos.x - max_val_pos.x;
   bb=pos.y - max_val_pos.y;
   result_x=aa/5;
   result_y=bb/5;
   CvPoint po;
   po.x=max_val_pos.x+result_x;
   po.y=max_val_pos.y+result_y;
           
 /*         IplImage* roi_image=cvCreateImage(cvSize(src2->width, src2->height),
            src2->depth, src2->nChannels );
            CvRect rect = {max_val_pos.x, max_val_pos.y, src2->width, src2->height};
           cvSetImageROI(frame_copy2, rect);
*/ // 이소스는 인식한 영역만 보여주는 소스..
 
 IplImage* roi_image3=cvCreateImage(cvSize(result_x,
            result_y),src3->depth, src3->nChannels );
 CvRect rects = {max_val_pos.x, max_val_pos.y, result_x, result_y};
 cvSetImageROI(frame_copys2, rects);
   
 cvResize (frame_copys2, roi_image3, CV_INTER_LINEAR);
 cvNamedWindow("roi", CV_WINDOW_AUTOSIZE);
 cvShowImage("roi", roi_image3);
    
 cvWaitKey(10);  //새창에 영상 띄울때 꼭 들어가야 해용
 
 }
 
 
//  이미지 소스랑 거의 관련없으나...다이얼로그에서
      영상이 뿌려주는  차이가 있다...callback함수이용
 
 
 

 

인터페이스?? 제공: 데브피아..

2008. 10. 3. 21:00

5개로 분활하여 실행하는 소스


void CPracticeDlg::OnButton8()    // 템플릿
{

 IplImage* src=cvLoadImage("1.jpg",1);
 IplImage* src2=cvLoadImage("3.jpg",1);
 IplImage* dst_image=cvCreateImage(cvSize(src->width-src2->width+1,src->height-src2->height+1),IPL_DEPTH_32F,0);
 IplImage* dst2=cvCloneImage(src);    
 IplImage* frame_copy2 = cvCreateImage( cvSize(src->width,src->height),
                                            IPL_DEPTH_8U, src->nChannels );
 IplImage* frame_copy = cvCreateImage( cvSize(src->width,src->height),
                                            IPL_DEPTH_8U, src->nChannels );

 if( src->origin == IPL_ORIGIN_TL ) {  //Top-Left Origin
                cvCopy( src, frame_copy2, 0 );
    cvCopy( src, frame_copy, 0 );
   }else{
                cvFlip( src, frame_copy2, 0 );
    cvFlip( src, frame_copy, 0 );
   }
 
   
 
 // 이미지를 복사한다. cvCloneImage
 // 이미지의 설정내용을 가져온다.  cvCreateImage

 

 //상관계수를 이용하여 템플릿 매칭
 cvMatchTemplate(src,src2,dst_image,CV_TM_CCOEFF_NORMED);

 double min_val, max_val;
 CvPoint max_val_pos, pos;
 cvMinMaxLoc(dst_image, &min_val, &max_val, NULL, &max_val_pos);  // 유사도가 최대인 위치 얻음
 /*MinMaxLoc
              Finds global minimum and maximum in array or subarray

        void cvMinMaxLoc( const CvArr* A, double* minVal, double* maxVal,
                          CvPoint* minLoc, CvPoint* maxLoc, const CvArr* mask=0 );

A
The source array, single-channel or multi-channel with COI set.
minVal
Pointer to returned minimum value.
maxVal
Pointer to returned maximum value.
minLoc
Pointer to returned minimum location.
maxLoc
Pointer to returned maximum location.
mask
The optional mask that is used to select a subarray.
*/

 pos.x = max_val_pos.x + src2->width;
 pos.y = max_val_pos.y + src2->height;

 

  int aa,bb,result_x,result_y;
   aa=pos.x - max_val_pos.x;
   bb=pos.y - max_val_pos.y;
   result_x=aa/5;
   result_y=bb/5;

   CvPoint po;
   po.x=max_val_pos.x+result_x;
   po.y=max_val_pos.y+result_y;
           
         IplImage* roi_image=cvCreateImage(cvSize(src2->width, src2->height),
            src2->depth, src2->nChannels );
            CvRect rect = {max_val_pos.x, max_val_pos.y, src2->width, src2->height};
           cvSetImageROI(frame_copy2, rect);


   IplImage* roi_image2=cvCreateImage(cvSize(result_x, result_y),
            src2->depth, src2->nChannels );
            CvRect rect2 = {max_val_pos.x, max_val_pos.y, result_x, result_y};
           cvSetImageROI(frame_copy, rect2);
 
   cvResize (frame_copy2, roi_image, CV_INTER_LINEAR);
   cvResize (frame_copy, roi_image2, CV_INTER_LINEAR);

 


 cvRectangle(dst2, max_val_pos, pos, CV_RGB(255,0,0));

 

 cvNamedWindow("src", CV_WINDOW_AUTOSIZE);
 cvShowImage("src", src);
 cvNamedWindow("template", CV_WINDOW_AUTOSIZE);
 cvShowImage("template", roi_image2);
 cvNamedWindow("dest", CV_WINDOW_AUTOSIZE);
 cvShowImage("dest", roi_image);
 cvNamedWindow("found region", CV_WINDOW_AUTOSIZE);
 cvShowImage("found region", dst2);

 

 cvReleaseImage(&src);
 cvReleaseImage(&roi_image2);
 cvReleaseImage(&roi_image);
 cvReleaseImage(&dst2);

}

 

 

 

결과....

 

 


컬러코드이미지가 잡혔다는 가정하에...쉽게 탬플릿으로 일단 잡고.

 

원본에서 잡은 컬러코드의 위치를 찾아..원도우에 나타내고..

 

인식한 컬러코드를 5*5 분활하여 다른 원도우로 나타냄...

 

즉 D11의 색이 지금 초록인데...결과값을 보면 원도우에

 

초록색만 잡혀져 있다... 

 

   int aa,bb,result_x,result_y;
   aa=pos.x - max_val_pos.x;
   bb=pos.y - max_val_pos.y;
   result_x=aa/5;
   result_y=bb/5;

   CvPoint po;
   po.x=max_val_pos.x+result_x;
   po.y=max_val_pos.y+result_y;

  

이식 수식을 늘려 총 25개의 영역을 나눌 것이다...

 

좀더 간단한 수식으로는 안될까???  흠

2008. 10. 3. 20:59

매트릭스별 색인식 법



 

 


 

 

인식되어진 컬러코드의 각 매트릭스별 컬러인식을 위해

(WIDTH의 5등분),(HEIGHT의 5등분)로 각각 구역을 구한 후

각 영역을 구분하면서 동시에 그 영역의 색을 파악하여 4가지색중 맞는 색에 대한 int값을 배열이나 다른 자료구조에 저장한다.

이런씩으로 25개의 영역까지 인식,저장하여 이값들의 정해진 표준화에 대해 수식계산을 하고 이값을 사용하면 될듯...


for(int  i=0; i<=4;i++){

  for(int j=0; j<=4;j++){

   D[i+1][j+1]

   ...   // 색을 구분하는 소스...

   ...

  }

}

이런식으로...

 

매트릭스안의 각 색을 인식할 때는 모양이 삐뚤어져 있거나 다른 형태로인점을 감안하여 그 영역에서 가장 많은 영역을 차지하는 색을 선택하도록(다수결로) 될듯...패턴인식처럼...

2008. 10. 3. 20:57

ColorCode란??


ColorZip's latest code tech, ColorCode

ColorCode

May not be the case in America where 2D-code technology is, er, drastically archaic, but the rest of the world seems to be appropriately enthusiastic about fitting lots of data into printable code. QR code (top right) is the current Big Deal with up to 7,000 encodable characters in one block. But ColorZip wants their ColorCode technology to unseat new 800lb 2D-code gorilla; unlike barcodes and QR codes, which are inherantly offline technologies, ColorCode merely encodes URL-like data locators (think tinyurl), which means to interpret the code you have to retrieve its corresponding data online. Of course, this alleviates the problem of an encoded character limit, but also has the unfortunate side-effect of requiring a net connection. Fortunately for the Japanese, that's something they've got little to worry about.

 

from : http://www.engadget.com/2005/04/22/colorzips-latest-code-tech-colorcode/

한국 저작권 사이트  : http://www.colorzip.co.kr/product/color.asp