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

20141007 영상처리 이재우

by 알 수 없는 사용자 2014. 10. 8.
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;
unsigned int uiPad;
unsigned char * BMbuf;
BITMAPFILEHEADER * stpBFH;
BITMAPINFOHEADER * stpBIH;

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
 PAINTSTRUCT ps;
 HANDLE hFile;
 static unsigned int uiX;
 static unsigned int uiY;

 DWORD dwRead;

 switch(iMessage)
 {
 case WM_CREATE:
  HWndMain = hWnd;

  // 이미지 불러오기 및 설정 // 시작-----------------
  hFile = CreateFile(TEXT("image1.bmp"),
   GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  //[2] 동적할당
  BMbuf = (unsigned char *)malloc(BITMAP_MAXSIZE);
  if(0 == BMbuf)//[3] 동적할당 실패시 에러 처리
  {
   MessageBox(hWnd, TEXT("동적할당을 받을 수 없습니다."), TEXT("오류"), MB_OK);
   DestroyWindow(hWnd);
  }

  if(INVALID_HANDLE_VALUE != hFile)//[3]-1 File Open
  {
   ReadFile(hFile, BMbuf, BITMAP_MAXSIZE, &dwRead, NULL);
   CloseHandle(hFile);

   //[4] 저장된 데이터 비트맵 파일 헤더 포인터 설정
   stpBFH = (BITMAPFILEHEADER *)BMbuf;
   stpBIH = (BITMAPINFOHEADER *)(BMbuf + sizeof(BITMAPFILEHEADER));

   //[5] 윈도우 창 정보 셋팅 가로 세로 크기 지정
   uiX = (unsigned int)(stpBIH->biWidth);
   uiPad = uiX%4;
   uiY = (unsigned int)(stpBIH->biHeight);
  }
  else
  {
   DestroyWindow(hWnd);
  }
  // 이미지 불러오기 및 설정 // 끝-------------------

  vfw = capCreateCaptureWindow(  TEXT("CAM")
   ,WS_CHILD | WS_VISIBLE
   ,0
   ,0
   ,400
   ,300
   ,hWnd
   ,NULL);

  capDriverConnect(vfw,0);
  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, 1);
  capPreview(vfw, FALSE);
  return 0;

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

 case WM_DESTROY:
  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;
 unsigned char * ucpPixel;

 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);
 // 원본 영상 그리기 // 끝

 // 영상 편집 // 시작
 ucpPixel = BMbuf + stpBFH->bfOffBits - 3;
 Jump= 0;
 for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY) 
 {       
  for(iCntX = 0; iCntX  < Bm.bmiHeader.biWidth  ; ++iCntX, Jump += 3 )
  {
   ucpPixel = ucpPixel + 3;
   if(lpData->lpData[Jump + 2] > 100)
   {
    continue;
   }
   if(lpData->lpData[Jump + 1] > 100)
   {
    continue;
   }
   if(lpData->lpData[Jump + 0] > 50)
   {
    lpData->lpData[Jump]    = *(ucpPixel+0);  // 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

'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글

20141008 영상처리 김진철  (0) 2014.10.08
20141007-김해성  (0) 2014.10.08
20141008서상우  (0) 2014.10.08
20141008 영상처리 문대영  (0) 2014.10.08
20141007 영상처리 허수웅  (0) 2014.10.08
2014.10.07. 업무일지 [출석번호 22 허수웅]  (5) 2014.10.08
20141007 영상처리 - 손병규  (0) 2014.10.07
영상처리 - 이경진  (0) 2014.10.07