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

20151125_안향진_API_10

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

<캠>


=영상을 히스토그램으로 정규화한 그래프와 결과영상



=결과







=알파 : 투명한 색상을 변경할 색상


-일기예보

특정 칠판 색








평균값:

178







-블루스크린 : 영화에서 사용










#include <windows.h>
#include
 <vfw.h>

//#pragma comment(lib, "vfw32.lib")


#define
 MALPHA 214
#define
 GALPHA 70
#define
 HALPHA 255//(MALPHA+GALPHA)
#define
 LALPHA (MALPHA-GALPHA)

#define
 XSCALE 320
#define
 YSCALE 240

HWND hCam;
BITMAPINFO stBmpInfo;

static
 BYTE Bdata[XSCALE*YSCALE * 3];

typedef
 struct
{
  UINT uiMSG;
  LRESULT(*fp) (WPARAM, LPARAM);

}stMSG_Map;

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

LRESULT On_Paint(WPARAM wParam, LPARAM lParam);
LRESULT On_Create(WPARAM wParam, LPARAM lParam);
LRESULT On_Destroy(WPARAM wParam, LPARAM lParam);
LRESULT capture(HWND, LPVIDEOHDR);

HINSTANCE g_hInst;
LPSTR lpszClass 
= L"캠";

stMSG_Map stMap[] 
= {
  { WM_PAINT, On_Paint },
  { WM_CREATE, On_Create },
  { WM_DESTROY, On_Destroy },
  { WM_NULL, 0 }
};

HWND hWnd;

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, 0, 0, 0)) {
    TranslateMessage(
&Message);
    DispatchMessage(
&Message);
  }
  return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWpWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
  hWnd 
= hWpWnd;
  stMSG_Map * stpMap 
= stMap;

  while (WM_NULL !
= ((*stpMap).uiMSG))
  {
    if (iMessage 
== ((*stpMap).uiMSG))
    {
      return (((*stpMap).fp)(wParam, lParam));
    }
    ++stpMap;
  }

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

LRESULT On_Paint(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;  

  hdc 
= BeginPaint(hWnd, &ps);

  EndPaint(hWnd, 
&ps);
  return 0;
}

LRESULT Capture(HWND hWpWnd, LPVIDEOHDR lpVHdr)
{
  HDC hdc;
  UINT uiXCnt;
  UINT uiYCnt;
  UINT uiCal;

  static BYTE Vdata[XSCALE*YSCALE*3];

  hdc 
= GetDC(hWnd);

  //memcpy(Vdata, lpVHdr-
>lpData, lpVHdr->dwBufferLength);
  
  for (uiYCnt 
= 0; uiYCnt < YSCALE; ++uiYCnt)
  {
    for (uiXCnt 
= 0; uiXCnt < XSCALE; ++uiXCnt)
    {
      uiCal 
= 3 * (uiYCnt*XSCALE + uiXCnt);
      Vdata[uiCal + 0] 
= *((lpVHdr->lpData + uiCal + 0));
      Vdata[uiCal + 1] 
= *((lpVHdr->lpData + uiCal + 1));
      Vdata[uiCal + 2] 
= *((lpVHdr->lpData + uiCal + 2));
      if (HALPHA 
< Vdata[uiCal + 0])
      {
        continue;
      }
      if (LALPHA 
> Vdata[uiCal + 0])
      {
        continue;
      }
      if (HALPHA 
< Vdata[uiCal + 1])
      {
        continue;
      }
      if (LALPHA 
> Vdata[uiCal + 1])
      {
        continue;
      }
      if (HALPHA 
< Vdata[uiCal + 2])
      {
        continue;
      }
      if (LALPHA 
> Vdata[uiCal + 2])
      {
        continue;
      }
      Vdata[uiCal + 0] 
= Bdata[uiCal + 0];
      Vdata[uiCal + 1] 
= Bdata[uiCal + 1];
      Vdata[uiCal + 2] 
= Bdata[uiCal + 2];
    }
  }

  StretchDIBits(hdc, XSCALE + 20, 0, XSCALE, YSCALE, 0, 0, XSCALE, YSCALE, Vdata, 
&stBmpInfo, DIB_RGB_COLORS, SRCCOPY);
  
  ReleaseDC(hWpWnd, hdc);
  return 0;
}

LRESULT On_Create(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;  
  BOOL bRet;
  BITMAPFILEHEADER stBFHead;
  BITMAPINFOHEADER stBFInfo;
  
  HANDLE hFile;
  DWORD dwCnt;

  hFile 
= CreateFile(L"bg.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  
if (INVALID_HANDLE_VALUE == hFile)
  {
    MessageBox(hWnd, L"Open Error", L"ERROR", MB_OK);
    PostQuitMessage(
0);
    
return 0;
  }

  bRet 
= ReadFile(hFile, &stBFHead, sizeof(BITMAPFILEHEADER), &dwCnt, NULL);
  
if (FALSE == bRet)
  {
    MessageBox(hWnd, L"File헤더 Read Error", L"ERROR", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(
0);
    
return 0;
  }

  bRet 
= ReadFile(hFile, &stBFInfo, sizeof(BITMAPINFOHEADER), &dwCnt, NULL);
  
if (FALSE == bRet)
  {
    MessageBox(hWnd, L"Info헤더 Read Error", L"ERROR", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(
0);
    
return 0;
  }

  
if (YSCALE < stBFInfo.biHeight)
  {
    MessageBox(hWnd, L"Big Image", L"ERROR", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(
0);
    
return 0;
  }

  
if (XSCALE < stBFInfo.biWidth)
  {
    MessageBox(hWnd, L"Big Image", L"ERROR", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(
0);
    
return 0;
  }

  bRet 
= ReadFile(hFile, Bdata, stBFInfo.biSizeImage, &dwCnt, NULL);
  
if (FALSE == bRet)
  {
    MessageBox(hWnd, L"Back Image Data Read Error", L"ERROR", MB_OK);
    CloseHandle(hFile);
    PostQuitMessage(
0);
    
return 0;
  }
  CloseHandle(hFile);

  hCam 
= capCreateCaptureWindow(L"스마트", WS_CHILD | WS_VISIBLE, 0, 0, XSCALE, YSCALE, hWnd,0);

  if (NULL 
== hCam)
  {
    MessageBox(hWnd, L"
창을 생성할 수 없습니다", L"Error", MB_OK);
    PostQuitMessage(
0);
    
return 0;
  }

  bRet 
= capDriverConnect(hCam, 0);
  
if (FALSE == bRet)
  {
    MessageBox(hWnd, L"카메라를 찾을 수 없습니다.
", L"Error", MB_OK);
    PostQuitMessage(
0);
    
return 0;
  }
  
  capPreviewRate(hCam, 
1);
  capGetVideoFormat(hCam, 
&stBmpInfo, sizeof(BITMAPINFO));

  stBmpInfo.bmiHeader.biWidth 
= XSCALE;
  stBmpInfo.bmiHeader.biHeight 
= YSCALE;
  capSetVideoFormat(hCam, 
&stBmpInfo, sizeof(BITMAPINFO));
  
  capSetCallbackOnFrame(hCam, Capture);
  capPreview(hCam, TRUE);
  
  hdc 
= GetDC(hWnd);

  ReleaseDC(hWnd, hdc);
  
  
return 0;
}

LRESULT On_Destroy(WPARAM wParam, LPARAM lParam)
{
  capDriverDisconnect(hCam);
  PostQuitMessage(
0);
  
return 0;
}


728x90