본문 바로가기
코스웨어/14년 스마트컨트롤러

20141007 영상처리 - 손병규

by 알 수 없는 사용자 2014. 10. 7.
728x90
반응형

#include <windows.h>
#include "vfw.h"
#pragma comment(lib, "vfw32.lib")

#define BITMAP_MAXSIZE (1024*768*3+10)

LRESULT CALLBACK  WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK  FramInfo(HWND, LPVIDEOHDR);

HINSTANCE g_hInst;
HWND Hwndmain;
LPCTSTR lpszClass=TEXT("WiseCat");

HWND vfw;    //캠 핸들
BITMAPINFO Bm;  //캠 정보 저장 구조체

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
           ,LPSTR lpszCmdParam,int nCmdShow)
{
  HWND hWnd;
  MSG Message;
  WNDCLASS WndClass;
  g_hInst = hInstance;

  WndClass.cbClsExtra=0;
  WndClass.cbWndExtra=0;
  WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
  WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
  WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  WndClass.hInstance=hInstance;
  WndClass.lpfnWndProc=WndProc;
  WndClass.lpszClassName=lpszClass;
  WndClass.lpszMenuName=NULL;
  WndClass.style=CS_HREDRAW | CS_VREDRAW;
  RegisterClass(&WndClass);

  hWnd=CreateWindow(  lpszClass
            ,lpszClass
            ,WS_OVERLAPPEDWINDOW
            ,CW_USEDEFAULT
            ,CW_USEDEFAULT
            ,CW_USEDEFAULT,CW_USEDEFAULT
            ,NULL
            ,(HMENU)NULL
            ,hInstance
            ,NULL);        
  ShowWindow(hWnd,nCmdShow);

  while(GetMessage(&Message,NULL,0,0))
  {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }

  return (int)Message.wParam;
}

HDC hdc;
BITMAPFILEHEADER * stpBFH;
BITMAPINFOHEADER * stpBIH;
unsigned char * ucpPixel;
unsigned char *ucBitBuffer;
HBITMAP MyBit;
HBITMAP OldBit;
HDC MemDC;
unsigned int uiPad;
unsigned int uiX;
unsigned int uiY;


LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
  PAINTSTRUCT ps;
  HANDLE hFile;
  DWORD dwReadSize;
  
  switch(iMessage)
  {
    case WM_CREATE:
    Hwndmain = hWnd;
    
    ucBitBuffer=(unsigned char *)malloc(BITMAP_MAXSIZE);
      
    hFile=CreateFile(TEXT("smart.bmp"),GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if(hFile == INVALID_HANDLE_VALUE)
    {
      MessageBox(hWnd,TEXT("image.bmp 파일을 열기 실패하였습니다."),TEXT("파일에러"),MB_OK);
      DestroyWindow(hWnd);
    }

    ReadFile(hFile,ucBitBuffer,BITMAP_MAXSIZE,&dwReadSize,NULL);
    
    CloseHandle(hFile);

    stpBFH=(BITMAPFILEHEADER *)ucBitBuffer;

    stpBIH=(BITMAPINFOHEADER *)(ucBitBuffer+sizeof(BITMAPFILEHEADER));

    uiX=(unsigned int)stpBIH->biWidth;
    uiPad=uiX%4;
    uiY=(unsigned int)stpBIH->biHeight;
    
    //캠 윈도우 생성
      vfw = capCreateCaptureWindow(  TEXT("CAM")
                      ,WS_CHILD | WS_VISIBLE
                      ,0
                      ,0
                      ,400
                      ,300
                      ,hWnd
                      ,0);

    //캠 장치 연결
      capDriverConnect(vfw,0);
      
    //캠 영상 정보 Bm 구조체 저장
    capGetVideoFormat(vfw,&Bm,sizeof(Bm));
      
    //캠 윈도우 크기 수정
    Bm.bmiHeader.biWidth  = 320;
      Bm.bmiHeader.biHeight = 240;
      
    //수정된 구조체 적용
    capSetVideoFormat(vfw,&Bm,sizeof(Bm));
      //capDlgVideoFormat(m_capwnd); 
      
    // 콜백함수
    capSetCallbackOnFrame(vfw, FramInfo);
      
    //영상 속도 조절
    capPreviewRate(vfw, 3);
      
    //미리보기X
    capPreview(vfw, FALSE);
      
      return 0;

    case WM_PAINT:
      hdc = BeginPaint(hWnd,&ps);
      EndPaint(hWnd,&ps);
      return 0;

    case WM_DESTROY:
    DeleteObject(MyBit);
    free(ucBitBuffer);
      PostQuitMessage(0);
      return 0;
  }
  return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK FramInfo(HWND hWnd, LPVIDEOHDR lpData)
{
  static int iCntX;
  static int iCntY;
  static int Jump;

  hdc = GetDC(Hwndmain);
  
  //비트맵을 원하는 크기로 확대 또는 축소시켜서 화면에 출력
  //원본영상
  StretchDIBits(hdc  , 0
            , 0
            , Bm.bmiHeader.biWidth
            , Bm.bmiHeader.biHeight
            , 0
            , 0
            , Bm.bmiHeader.biWidth
            , Bm.bmiHeader.biHeight
            , lpData->lpData
            , &Bm
            , DIB_RGB_COLORS
            , SRCCOPY);
  Jump= 0;

  ucpPixel=ucBitBuffer+stpBFH->bfOffBits;
  for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY)  
  {        
    for(iCntX = 0; iCntX  < Bm.bmiHeader.biWidth  ; ++iCntX, Jump += 3, ucpPixel=ucpPixel+3 )
    {
    // R값이 100이상이면 
      if(lpData->lpData[Jump + 2> 100)
      {
        continue;
      }
    // G값이 100이상이면
      if(lpData->lpData[Jump + 1> 100)
      {
        continue;
      }
    //B값이 50이상이면
      if(lpData->lpData[Jump + 0> 50)
      {
        lpData->lpData[Jump]    = *(ucpPixel);  // Blue
        lpData->lpData[Jump + 2]  = *(ucpPixel+2);  // Red
        lpData->lpData[Jump + 1]  = *(ucpPixel+1);  // Green
      }
    }
  ucpPixel=ucpPixel+uiPad;
  }


  StretchDIBits(hdc  , Bm.bmiHeader.biWidth +20
            , 0
            , Bm.bmiHeader.biWidth
            , Bm.bmiHeader.biHeight
            , 0
            , 0
            , Bm.bmiHeader.biWidth
            , Bm.bmiHeader.biHeight
            , lpData->lpData
            , &Bm
            , DIB_RGB_COLORS
            , SRCCOPY);

  ReleaseDC(Hwndmain, hdc);

  return 0;
}

728x90