2008. 10. 3. 21:15

아래의 방식까지..결과이미지




 Release-tkss8329.zip

 

음...

 

밑에 마스크 쉬운 그림선들이 짤려있는 거 같지만..

 

실제로는 연결되어있다..

 

302*240영상 패턴인식하는 동안 외곽 2,238,2,318이

 

넘어갈 경우에는 인식을 하지 못하도록 했다.

 

 


 

위에 그림을 보면 중심점이 사각형밖에 있다..그래도 패턴인식은

 

되는데...하다보면 y축가 240에 가까워 진다...

 

그걸 이용하여 238이 되면 인식이 못 되도록 했다..

 

양사면 모두 그런식으로 동작이 된다.

 

그리고 다른경우인

 

바깥에서 부터 인식하여 외각을 찾은 경우는

 

나중에 해결할 생각이다.

2008. 10. 3. 21:13

외곽선 추출 알고리즘 - 분류기



 
Rotations()-tkss8329.zip

인식은 되는거 같은데...흠...



BOOL curer=TRUE;// 양삼면이 막힌 부분의 분류기 처림후 다음 분류기가 실행되지 않도록 하고..다시 벗어나면 TRUE로 돌림


 if(b==1 && d==1 && f==1 && h==0){
  if(i==0){            //  ↘
          x_move=x_move+1;
    y_move=y_move-1;
    h_r=TRUE;
    curer=FALSE;

    change_num="g01";
    if(afxmess){
    AfxMessageBox("g01");
   
    }
  }else if(i==1){      //  ↓
          y_move=y_move-1;
          h_r=TRUE;
    curer=FALSE;

    change_num="g02";
    if(afxmess){
    AfxMessageBox("g02");
   
    }
  }
 }else if(b==0 && d==1 && f==1 && h==1){
  if(a==0){            //  ↖
          x_move=x_move-1;
    y_move=y_move+1;
    h_r=FALSE;
    curer=FALSE;

    change_num="g03";
    if(afxmess){
    AfxMessageBox("g03");
   
    }
  }else if(a==1){      //  ↑
          y_move=y_move+1;
    h_r=FALSE;
    curer=FALSE;

    change_num="g04";
    if(afxmess){
    AfxMessageBox("g04"); 
    }
  }
 }else if(b==1 && d==1 && h==1 && f==0){
  if(c==0){            //  ↗
          x_move=x_move+1;
    y_move=y_move+1;
    h_r=TRUE;
    curer=FALSE;

     change_num="g05";
    if(afxmess){
    AfxMessageBox("g05");
  
    }
  }else if(c==1){      //  →
          x_move=x_move+1;
    h_r=TRUE;
    curer=FALSE;

    change_num="g06";
    if(afxmess){
    AfxMessageBox("g06");
   
    }
  }
 }else if(b==1 && d==0 && h==1 && f==1){
  if(g==0){            //  ↙
          x_move=x_move-1;
    y_move=y_move-1;
    h_r=FALSE;
    curer=FALSE;

    change_num="g07";
    if(afxmess){
    AfxMessageBox("g07");
   
    }
  }else if(g==1){      //  ←
          x_move=x_move-1;
    h_r=FALSE;
    curer=FALSE;

    change_num="g08";
    if(afxmess){
    AfxMessageBox("g08");
   
    }
  }
 }


 if(curer){

 if(b==1 && c==0 && f==0){
  if(h==0){           //  ↗
          x_move=x_move+1;
    y_move=y_move+1;
    h_r=TRUE;

    change_num="g09";
    if(afxmess){
    AfxMessageBox("g09");
   
    }
  }else if(h==1){
   if(h_r){        //  ↗
              x_move=x_move+1;
        y_move=y_move+1;
        h_r=TRUE;

     change_num="g10";
     if(afxmess){
     AfxMessageBox("g10");
    
     }
   }else if(!h_r){
    if(g==0){   //  ↙
                  x_move=x_move-1;
            y_move=y_move-1;
            h_r=FALSE;

      change_num="g11";
         if(afxmess){
      AfxMessageBox("g11");
     
      }
    }else if(g==1){  //  ←
                  x_move=x_move-1;
            h_r=FALSE;

      change_num="g12";
      if(afxmess){
      AfxMessageBox("g12");
     
      }
    }
   }
  }
 }else if(b==1 && c==1 && f==0){
  if(h==0){           //  →
          x_move=x_move+1;
    h_r=TRUE;

     change_num="g13";
    if(afxmess){
    AfxMessageBox("g13");
  
    }
  }else if(h==1){     //  →
   if(h_r){
              x_move=x_move+1;
        h_r=TRUE;

     change_num="g14";
     if(afxmess){
     AfxMessageBox("g14");
    
     }
   }else if(!h_r){ //  ↙
    if(g==0){
                  x_move=x_move-1;
            y_move=y_move-1;
            h_r=FALSE;

      change_num="g15";
      if(afxmess){
      AfxMessageBox("g15");
     
      }
    }else if(g==1){  //  ←
                  x_move=x_move-1;
            h_r=FALSE;

      change_num="g17";
      if(afxmess){
      AfxMessageBox("g17");
     
      }
    }
   }
  }
 }


 if(f==1 && h==0 && i==0){
  if(d==0){               //  ↘
          x_move=x_move+1;
    y_move=y_move-1;
    h_r=TRUE;

    change_num="g18";
    if(afxmess){
    AfxMessageBox("g18");
   
    }
  }else if(d==1){
   if(h_r){            //  ↘
              x_move=x_move+1;
        y_move=y_move-1;
        h_r=TRUE;

     change_num="g19";
     if(afxmess){
     AfxMessageBox("g19");
    
     }
   }else if(!h_r){
    if(a==0){       //  ↖
                  x_move=x_move-1;
            y_move=y_move+1;
            h_r=FALSE;

      change_num="g20";
      if(afxmess){
      AfxMessageBox("g20");
     
      }
    }else if(a==1){ //  ↑
                  y_move=y_move+1;
            h_r=FALSE;

      change_num="g21";
      if(afxmess){
                 AfxMessageBox("g21");
    
      }
    }
   }
  }
 }else if(f==1 && h==0 && i==1){
  if(d==0){            //  ↓
          y_move=y_move-1;
          h_r=TRUE;

    change_num="g22";
    if(afxmess){
    AfxMessageBox("g22");
   
    }
  }else if(d==1){
   if(h_r){         //  ↓
              y_move=y_move-1;
              h_r=TRUE;
    
     change_num="g23";
     if(afxmess){
     AfxMessageBox("g23");
    
     }
   }else if(!h_r){
    if(a==0){    //  ↖
                  x_move=x_move-1;
            y_move=y_move+1;
            h_r=FALSE;

      change_num="g24";
         if(afxmess){
      AfxMessageBox("g24");
     
      }
    }else if(a==1){ //  ↑
                  y_move=y_move+1;
            h_r=FALSE;

      change_num="g25";
      if(afxmess){
      AfxMessageBox("g25");
     
      }
    }
   }
  }
 }


 if(h==1 && g==0 && d==0){
  if(b==0){            //  ↙
          x_move=x_move-1;
    y_move=y_move-1;
    h_r=FALSE;

    change_num="g26";
    if(afxmess){
    AfxMessageBox("g26");
   
    }
  }
 }else if(h==1 && g==1 && d==0){
  if(b==0){            //  ←
          x_move=x_move-1;
    h_r=FALSE;

    change_num="g27";
    if(afxmess){
    AfxMessageBox("g27");
   
    }
  }
 }


 if(d==1 && a==0 && b==0){
  if(f==0){             //  ↖
          x_move=x_move-1;
    y_move=y_move+1;
    h_r=FALSE;

    change_num="g28";
    if(afxmess){
    AfxMessageBox("g28");
   
    }
  }
 }else if(d==1 && a==1 && b==0){
  if(f==0){            //  ↑
          y_move=y_move+1;
    h_r=FALSE;

     change_num="g29";
    if(afxmess){
    AfxMessageBox("g29");
  
    }
  }
 }
 }



ps. 헐...소스 꼬라지 하고는..ㅡㅡ;;(2008.10월 블로그 옮기는 도중...)

2008. 10. 3. 21:11

꼭지점 좌표의 문제점①




 

 

 

  그림 1인 경우에는 시계방향으로 돌며 인식하는 패턴에 의해..

   a,b,c,d 각 좌표의 끝이 마지막 배열에 저장되므로.

   별로 문제될 것 없이 각 4꼭지점을 쉽게 찾을 수있다..

   그러나 그림2같은 경우는 각 초록색점들이 배열에 저장되므로

  위에 사진과 같이 제대로된 꼭지점을 찾지 못한다.(초록색사각형)


-> 해결방안

각 끝쪽을 찾기위해서 패턴인식하는중에 찾은 네개의 정보를 

이용하였다..

먼저 배열을 4개 선언하고..

각 패턴이동시에 동작한 if문 함수(네개의 정보를 찾기 위한 소스)

에서 모든 흔적을 배열에 각각 저장하였다.

 

    --이하 소스 참조--

// 꼭지점 찾는 소스
 if(x_move>=old_x_right){  

// 최고오른쪽의 꼭지점을 찾기위한 소스이지 위쪽 오른쪽 꼭지점을 찾는 소스가 아니다.
  old_x_right = x_move;
  old_x_right_y = y_move;
        ppt2[count_ppt2]=xy;
  count_ppt2++;
 }else if(x_move<=old_x_left){
  old_x_left = x_move;
        old_x_left_y = y_move;
  ppt4[count_ppt4]=xy;
  count_ppt4++;
 }

 if(y_move>=old_y_up){
  old_y_up = y_move;
        old_y_up_x = x_move;
  ppt1[count_ppt1]=xy;
  count_ppt1++;
 }else if(y_move<=old_y_down){
  old_y_down = y_move;
        old_y_down_x = x_move;
  ppt3[count_ppt3]=xy;
  count_ppt3++;
 }

 

위에 소스중에서 if(x_move>=old_x_right){에

 >=가 중요하다..=가 없다면 --------이 부분에서..

 나머지 값들은 무시될수 있기 때문이다.

 그럼 >만써서 처음 값만 저장하면 되지 않느냐하는

 의문도 생기지만..

 만약에 >로 쓰면 그림 1과 그림 2의 문제점이 바뀌어

 버린다..그림2는 별 탈없이 인식이 되지만..

 처음 값들만을 저장하기 때문에... 그림1과 같이 마지막

 값이 필요한 경우 마찬가지로 꼭지점찾는데 문제가 생긴다..

 결국엔 둘중 하나는 희생해야되는 것이다.. 

 

이렇게 저장한 배열에서 중앙y축을 기준으로 하여

old_y_up_x(제일 위쪽의 좌표-아직 완전한 꼭지점은 아님)

 


 

가 xx_half축보다 작으면 그림2와 같은 상황이 되고...소스가 동작하게 된다.

그리고 저장된 count_ppt1만큼 배열에 저장된 데이터로 부터 모든 y축 값을 뽑아네고.그 값이

old_y_up(제일 위쪽 y축값)이랑 같은 값만 if문에 실행되도록 하였다..

그러면 제일 위쪽의 ----------부분들만 처리할수 있게 된다..

이값들은 y축값은 다 같지만 x축값은 다 다르다..

이 x축 값 가운데 가장 작은 값을 찾으면..그 좌표가 바로 꼭지점이 된다.

나머지 3개의 꼭지점도 이런식으로 찾았다.

 

CString CColorCodeDlg::find_4points()
{
 int x_x,y_y,o=0;
  CString zzz;
      if(old_y_up_x<xx_half){
            for(o; o<=count_ppt1;o++){
   y_y=Returrnsy(ppt1[o]);            
            if(y_y==old_y_up){
    x_x=Returrns(ppt1[o]);
    if(result_up_x>x_x){
     result_up_x=x_x;
     old_y_up_x=x_x;
    }
   }
   }


   for(o; o<=count_ppt2;o++){
   x_x=Returrns(ppt2[o]);            
            if(x_x==old_x_right){
    y_y=Returrnsy(ppt2[o]);
    if(result_right_y<y_y){
     result_right_y=y_y;
     old_x_right_y=y_y;
    }
   }
   }


   for(o; o<=count_ppt3;o++){
   y_y=Returrnsy(ppt3[o]);            
            if(y_y==old_y_down){
    x_x=Returrns(ppt3[o]);
    if(result_down_x<x_x){
     result_down_x=x_x;
     old_y_down_x=x_x;
    }
   }
   }

            for(o; o<=count_ppt4;o++){
   x_x=Returrns(ppt4[o]);            
            if(x_x==old_x_left){
    y_y=Returrnsy(ppt4[o]);
    if(result_left_y>y_y){
     result_left_y=y_y;
     old_x_left_y=y_y;
    }
   }
   }

  }else if(old_y_up_x<xx_half){

  }

  // 초기화
  result_down_x=0;
  result_left_y=240;
  result_up_x=320;
  result_right_y=0;

  
 count_ppt1=0;
 count_ppt2=0;
 count_ppt3=0;
 count_ppt4=0;

 

return "";

}