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

20151125-김재홍-영상처리

by 알 수 없는 사용자 2015. 11. 25.
728x90
반응형

/***영상처리***/


#include <windows.h>
#include <Vfw.h>

#define XSCALE  320
#define YSCALE  240

#define MALPHA  180
#define GALPHA  20
#define HALPHA  (MALPHA + GALPHA)
#define LALPHA  (MALPHA - GALPHA)

BITMAPINFO stBMPInfo;

typedef struct _msgmap
{
  UINT uiMsg;
  LRESULT(*fp)(HWND, WPARAM, LPARAM);
} stMsgMap;

LRESULT OnPaint(WPARAM, LPARAM);
LRESULT OnCreate(WPARAM, LPARAM);
LRESULT OnDestroy(WPARAM, LPARAM);
LRESULT capture(HWND, LPVIDEOHDR);

stMsgMap MsgMap[] =
{
  { WM_PAINT, OnPaint },
  { WM_CREATE, OnCreate },
  { WM_DESTROY, OnDestroy },

  { WM_NULL, 0 }
};

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPSTR lpszClass = TEXT("smart");
HWND hWnd;
DWORD       dwBufferLength;

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

  WndClass.cbClsExtra = 0;
  WndClass.cbWndExtra = 0;
  WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
  WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  WndClass.hInstance = hInstance;
  WndClass.lpfnWndProc = (WNDPROC)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, 000)) {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWpWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  hWnd = hWpWnd;

  stMsgMap *stpMap = MsgMap;

  while (WM_NULL != ((*stpMap).uiMsg))
  {
    if (iMessage == ((*stpMap).uiMsg))//dest가 들어오면
    {
      return (((*stpMap).fp)(hWnd, wParam, lParam));
    }
    ++stpMap;
  }

  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

LRESULT OnCreate(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  HWND hCamera;
  BOOL bRet;

  hCamera = capCreateCaptureWindow(TEXT("samrt")
    , WS_CHILD | WS_VISIBLE
    , 00, XSCALE, YSCALE
    , hWnd, 0);
  if (NULL == hCamera)  
  {
    MessageBox(hWnd, TEXT("창을 열수 없음"), TEXT("밝명에러"), MB_OK);
  }

  bRet = capDriverConnect(hCamera, 0);  
  if (FALSE == bRet)  
  {
    MessageBox(hWnd, TEXT("카메라가 없음."), TEXT("밝명에러"), MB_OK);
  }

  capPreviewRate(hCamera, 1);        
  capGetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));  

  stBMPInfo.bmiHeader.biWidth = XSCALE;  
  stBMPInfo.bmiHeader.biHeight = YSCALE;

  capSetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));
  capSetCallbackOnFrame(hCamera, capture);
  capPreview(hCamera, TRUE);        

  hdc = GetDC(hWnd);
  ReleaseDC(hWnd, hdc);
  return 0;
}

LRESULT capture(HWND hWpWnd, LPVIDEOHDR lpVHdr)
{
  HDC hdc;
  INT iXCnt;
  INT iYCnt;
  INT iCal;

  static BYTE vData[XSCALE*YSCALE * 3];

  hdc = GetDC(hWnd);
  StretchDIBits(hdc
    , XSCALE, 0
    , XSCALE, YSCALE
    , 00
    , XSCALE, YSCALE
    , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY);


  for (iXCnt = 0; iXCnt < XSCALE; ++iXCnt)
  {
    for (iYCnt = 0; iYCnt < YSCALE; ++iYCnt)
    {
      iCal = (iYCnt * XSCALE + iXCnt) * 3;
      vData[iCal + 0= lpVHdr->lpData[iCal + 0];
      vData[iCal + 1= lpVHdr->lpData[iCal + 1];
      vData[iCal + 2= lpVHdr->lpData[iCal + 2];
      if (HALPHA < vData[iCal + 0])
      {
        continue;
      }
      if (LALPHA > vData[iCal + 0])
      {
        continue;
      }
      if (HALPHA < vData[iCal + 1])
      {
        continue;
      }
      if (LALPHA > vData[iCal + 1])
      {
        continue;
      }
      if (HALPHA < vData[iCal + 2])
      {
        continue;
      }
      if (LALPHA > vData[iCal + 2])
      {
        continue;
      }
      vData[iCal + 0= 255;
      vData[iCal + 1= 0;
      vData[iCal + 2= 0;
    }
  }

  ReleaseDC(hWpWnd, hdc);

  return 0;
}
LRESULT OnPaint(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;

  hdc = BeginPaint(hWnd, &ps);

  EndPaint(hWnd, &ps);
  return 0;
}
LRESULT OnDestroy(WPARAM wParam, LPARAM lParam)
{

  PostQuitMessage(0);
  return 0;
}







728x90