2008. 10. 3. 21:40

대화상자에 동영상뿌리기 - 소스첨부

 
 
ColorCode-tkss8329.zip 
 
 
OpenCV와는 거의 관련이 없지만 이 프로젝트에서는 어떻게 연관되지 않을수가 없는거 같다..
 
그래서 여기서 픽셀로 뿌리는 걸 설명하겠다..
 
픽셀만을 뿌리는 소스는 OpenCV실습자료실에 올려놓았다.
 
일단 처음 네이버에서 찾은 자료의 원본은
 
 
=========================================================================================
 

3. View 클래스 OnDraw(CDC* pDC)

- pDC 화면에 일일이 픽셀 하나씩 점을 찍으니 로드되는 시간이 너무 길다.

  그래서 메모리 비트맵을 사용하기로 했다.

 

 // (속도 개선을 위해 비트맵이용해서 비트맵에 그린 후에 화면에 전송하기 이용)
 

  CDC MemDC;  

  if (MemDC.GetSafeHdc() == NULL)
  {
   MemDC.CreateCompatibleDC(pDC); //화면 pDC와 호환되는 메모리DC 생성
  }

 

  CBitmap bmp;
  CBitmap* pOldBmp= NULL;
  bmp.CreateCompatibleBitmap(pDC, pDoc->n_OpenImg_Height, pDoc->n_OpenImg_Width); 

  //화면에 호환되는 비트맵 생성
  pOldBmp= (CBitmap*)MemDC.SelectObject(&bmp); //메모리DC에서 bmp 선택 
  
 for(int y=0; y<pDoc->n_OpenImg_Height; y++)
 {
 for(int x=0; x<pDoc->n_OpenImg_Width; x++)
 { 

          MemDC.SetPixel(x,y,
         RGB(*(pDoc->m_pDib->m_OpenImg),
                 *(pDoc->m_pDib->m_OpenImg),
                 *(pDoc->m_pDib->m_OpenImg))); //MemDC에 픽셀들에 RGB값을 찍는다.
         pDoc->m_pDib->m_OpenImg++; 
 }   
 }
 

 //화면에 그린다: BufferADC 안에 내용들을 화면에 표현
pDC->BitBlt(0, 0, pDoc->n_OpenImg_Height, pDoc->n_OpenImg_Width, 
&MemDC, 0, 0, SRCCOPY);

 

MemDC.SelectObject(pOldBmp);

 

ReleaseDC(&MemDC);
}

 
 
=========================================================================================
 
이였다. 위에 소스는 view에서 작성한 것이고..
 
dialog에서는
 
이렇게 고쳤다..
 
=========================================================================================
 
 
void CColorCodeDlg::draw_cam()
{
 if(Cam_Start){
 CClientDC dc(this);
 CDC MemDC; 
    if (MemDC.GetSafeHdc() == NULL)
 {
    MemDC.CreateCompatibleDC(&dc); //화면 pDC와 호환되는 메모리DC 생성
 CBitmap bmp;
    CBitmap* pOldBmp= NULL;
    bmp.CreateCompatibleBitmap(&dc,Widths,Heights);

 //화면에 호환되는 비트맵 생성
  pOldBmp= (CBitmap*)MemDC.SelectObject(&bmp); //메모리DC에서 bmp 선택
 
 int y2=-1;
 for(int y=Heights-1; y>=0; y--)
 {
     y2++;
     for(int x=0; x<=Widths-1; x++)
  {
   
    MemDC.SetPixel(x,y,RGB(Map2[y2][x].r, Map2[y2][x].g, Map2[y2][x].b)); //MemDC에 픽셀들에 RGB값을 찍는다.
  }  
 }

 //화면에 그린다
dc.BitBlt(200, 20, Widths, Heights,&MemDC, 0, 0, SRCCOPY);
MemDC.SelectObject(pOldBmp);
ReleaseDC(&MemDC);
 }
 }
}
 
 
 
 
그리고
 
 
 
 
void CColorCodeDlg::OnPaint()
{
 if (IsIconic())
 {
  CPaintDC dc(this); // device context for painting
  SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  // Center icon in client rectangle
  int cxIcon = GetSystemMetrics(SM_CXICON);
  int cyIcon = GetSystemMetrics(SM_CYICON);
  CRect rect;
  GetClientRect(&rect);
  int x = (rect.Width() - cxIcon + 1) / 2;
  int y = (rect.Height() - cyIcon + 1) / 2;
  // Draw the icon
  dc.DrawIcon(x, y, m_hIcon);
 }
 else
 {
        CPaintDC DC(this);
       draw_cam();

        CDialog::OnPaint();
 }
}
 
 
 
 
으로 했다...여기서 draw_cam(); 

// 해줘도 실행하는데에는 아직 이상이 없었다..

아마. main에서 계속해서 draw_cam();를 실행하기 떄문에 좀 커버가 되지 않나 싶다.

 

 

 

 

 

문제점 : showwindow라는 OpenCV함수를 쓰지 않으면

 

             메인대화상자가 죽어버리고...음..그래도 영상은 계속 뗘있다..ㅡㅡ

 

 

 

 

* 그리고 리스트박스에다 에러점을 출력하게 하였다..

.

2008. 10. 3. 21:39

대화상자에 동영상뿌리기.

2008. 10. 3. 21:38

방도없는 상황..ㅜㅇㅜ

 

 

 

 

위의 세가지 경우

컴퓨터가 사다리꼴이라는 것을 인지하는

down위 x축과 left의 x축이 같을 때 실행이 되는데..

노이즈때문에. ㅜㅜ

이건 또 어떻게 해야 할지..


2008. 10. 3. 21:38

기울기 함수 수정

오른쪽위 꼭지점이 찾아야 할 경우..이상하게 인식을 못하고...

시작점을 꼭지점으로 정해버리는 문제가 발생했다..

물론 내가 기울기 함수for문에서 못빠져나오면 끝에 값이 저장되어 그렇겠지만..

그러면 기울기가 문제가 있는거 같은데..잘 모르겠다..아직은..그래서 생각한 해결점은..

윗변이 평평하기 때문에..즉 윗변으로 넘어 올때 기울기를 못 찾는다음...그 평평한y축값에 위해..

기울기가 0일때 그 시작점을 꼭지점으로 주었다...

x축이 같을 경우는 물론 right변에서도 발생할 수있기떄문에 안되고...right변에서는 상식적으로 y축에 위한 기울기0이 발생하지 않는 거 같았다..

 

그래서...밑에 소스르 보면

 if((find1_a_x-find2_a_x)==0 || (find1_a_y-find2_a_y)==0){
   if(plusORminus){
    if((find1_a_y-find2_a_y)==0){
     fs=4;
    }else if((find1_a_x-find2_a_x)==0){
     fs=0;
    }
   }else if(!plusORminus){
      fs=0;
   }
 
  }else if((find1_a_x-find2_a_x)!=0 && (find1_a_y-find2_a_y)!=0){
      fs=(find1_a_x-find2_a_x)/(find1_a_y-find2_a_y);
 
  }

 

이런식으로...^^

원래 소스는

 

  

if((find1_a_x-find2_a_x)==0 || (find1_a_y-find2_a_y)==0){
 
     fs=0;
 

}else if((find1_a_x-find2_a_x)!=0 && (find1_a_y-find2_a_y)!=0){

     fs=(find1_a_x-find2_a_x)/(find1_a_y-find2_a_y);
 
  }

였다..

 

수정결과...


2008. 10. 3. 21:36

사다리꼴 문제점 해결1 - 2부

우선 말하고자 할 것이 있다..

출력하여 살펴본 결과..시작점이랑 최고up점이랑 같을 경우..즉..겹침의 상황에서는

꼭지점을 알아서 찾아 내었다...

위에 따로 소스가 있으니까..그게 실행되어 찾더라..^^

근데..만약 시작점이 up보다 작은 y축에 있을 경우..즉!!

겹침현상이 아닐경우..(앞에 1부 결과 사진 잘볼 것)

발생하는 문제점을 해결하기 위한 소스임을 밝혀둔다..

그럼./.

 

그 사다리꼴을 해결하기 위한 소스이다.

if(old_y_up_x<xx_half || what==4 || what==2){ 

 

    if(old_x_left_y == old_y_up){
               plusORminus=TRUE;
               outlet1=sadarigol4(old_x_right, old_x_right_y);
               old_y_up_x=Returrns(outlet1);
               old_y_up=Returrnsy(outlet1);

    }else if(old_x_left != old_y_up_x){

 

              처음점 찾는 소스랑 나머지 사다리꼴 찾는 소스이다..

 

    }

 

 

 

 

무지 간단하게 구현되었다..

앞에서 구현되었던 똑같은 경우

if(old_y_up_x<xx_half || what==4 || what==2){ 

일 경우에는 모두 처음점을 이용하여 꼭지점을 찾아야 했지만..

이 경우는 끝점을 찾아야 하므로..

처음점을 찾는 소스 바로 앞에다

if(old_x_left_y == old_y_up){
}를 구현했다..

이유는 성질을 잘 살펴보면 최고 왼쪽점의 y축값이랑

최고 위쪽점의 y축값이랑 같음을 찾을 수 있기 때문이다..

나머지 안의 소스는 앞에 겹침현상에서 쓴 소스랑 거의 같다..

 

그러나.

 한가지 짚을 것은..

 +3이나..-3을 이용하여 기울기함수를 쓸때..

 all_count의 0값보다..작은 곳에 꼭지점의 좌표가 저장되어있을 확률이 높기때문에..

 차라리 right값을 넘겨주어..

 거기서 부터..기울기함수를 호출하여 계산한 값을

 up값에 각각 넣어 버리면 간단해지기 때문에...그렇게 해따..

 그리고 다시 실행한 결과사진은

 

..

 

 

 

 

이다..


2008. 10. 3. 21:35

사다리꼴 문제점 해결1 - 1부


 

 

 

 

위에 그림은 앞에서 작성한 사다리꼴 상태의 틀이였다. 하지만


위에 네가지 사다리꼴 외에도 나타나는 현상은 몇가지 더 있었다..

 

밑에 출력결과 보면

 

 

위에 결과를 보면

 

중 한가지의 현상이 나타남을 볼수 있을 것이다.(위쪽 사다리꼴)

 

사실 모양은 사다리꼴이 아니라..다각형이지만..^^

 

아무튼...^^

 

2부 계속

2008. 10. 3. 21:34

9개의 영역 색인식...(5개픽셀 이용 색인식)

 

                                                     Release(실행파일)-tkss8329.zip


2008. 10. 3. 21:28

9개의 영역 중심점으로 색인식



 

 

먼저 색에 대한 인식률을 3부분으로 나누어서

햇빛이 비칠때의 명도와..

형광등에 비친 명도..

다 turn off된 상태의 어두운 명도로 나누어..

각 rgb값을 비교하여 구별하였다..

 

 

 소스는 네이버 블로그 참조~
 http://blog.naver.com/tkss8329

2008. 10. 3. 21:28

9개의 영역 중심점을 찾음...

 

 

 

 

9개의 영역을 찾을 때...앞에서 찾은 3by3의 영역의 각 좌표를 이용하여 찾을려 했으나..

 

차라리 각변을 6개로 나누어서 찾았다...

 

문자열로 좌표를 저장하고 다시 정수화 시켜 구분하여 각각 좌표를 찾았는 것도..

 

구조체배열정수로 바꾸었다...

 

 

struct points{
 int x_point;
 int y_point;
} ninthteen_points[100];           

 

그러면 총 44개의 좌표가 들어가는데...그중에

 

20번, 22번, 24번, 30번, 32번, 34번, 40번, 42번, 44번

이 9개의 중심 점이며...

 

main(){

 

  separateLine(right.x,right.y,up.x,up.y);        // 위에 변부터
  separateLine(down.x,down.y,right.x,right.y);    // ...
  separateLine(down.x,down.y,left.x,left.y);     // ...
  separateLine(left.x,left.y,up.x,up.y);         // 시계방향으로 돌아 왼쪽 변까지
   
  separateLine(ninthteen_points[0].x_point, ninthteen_points[0].y_point,

                      ninthteen_points[10].x_point, ninthteen_points[10].y_point);
  separateLine(ninthteen_points[1].x_point, ninthteen_points[1].y_point,

                      ninthteen_points[11].x_point, ninthteen_points[11].y_point);
  separateLine(ninthteen_points[2].x_point, ninthteen_points[2].y_point,

                      ninthteen_points[12].x_point, ninthteen_points[12].y_point);
  separateLine(ninthteen_points[3].x_point, ninthteen_points[3].y_point,

                      ninthteen_points[13].x_point, ninthteen_points[13].y_point);
  separateLine(ninthteen_points[4].x_point, ninthteen_points[4].y_point,

                      ninthteen_points[14].x_point, ninthteen_points[14].y_point);
   

}

 

이점을 이용하여 나중에 색을 구별할 수 있을것이다.

그리고 색을 구별할때  다시 imagedata를 돌릴필요없이..

마스크 씌울때 쓴 구조체를 이용하면 될 것 같다.

 

 

struct stMap{               // 각 픽셀값에 따른 3가지 rgb값을 저장하기 위한 구조체

 unsigned char r;
 unsigned char g;
 unsigned char b;

} Map[Heights][Widths];

2008. 10. 3. 21:24

문제점 - 마름모형태


 


 

생각만 해도 머리 아픈..마름모..ㅡㅁㅡ;;;;;;;

좌표 찍힌거 봐라..난리다 난리..ㅡㅁㅡ

coming soon~~~