2008. 10. 3. 21:43

새로운 버그



 

 

위에 보는 것과 같이 중심점으로 부터 첫 시작점을 찾기 위해 위로 올라가는 중 만나는 노이즈의

 

흰 점이 있는데..그점을 주위를 보면

 

9개의 픽셀영역중에 a지점만 흰 영역이 되기 때문에...분류기에 없는 상황이 되어...

 

분류기의 기능을 잃게 된다...그래서..이 경우는 아예 인식하는 소스 자체에서 나와..

 

컬러코드인식변수는 FALSE로 한 후 다음 프레임부터는 인식을 하지 않게 하여

 

디버그에러가 나지 않게 하였다.. 

2008. 10. 3. 21:42

인터페이스 수정및 색정렬



 

Release-tkss8329.zip


 

 

 

녹색을 기준으로 하여 색을 정렬 하였다..

 

만약 녹색 정보가 없으면 색을 아예 다 날려 검은 색으로 나오게 하였다..

 

녹색주위에 노이즈가 꽤 많아서..하나만 쓰는 녹색으로 기준을 잡았다..

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함수를 쓰지 않으면

 

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

 

 

 

 

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

.