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

20151125_주재민_API_10

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

 

특정 색깔을 파란색으로 바꾸는 것을 해봄.

 

 

 

R 184

G 188

B 187

 

(184+188+187)/3 =186

 

 

#include <windows.h>
#include <Vfw.h>
#include "resource.h"
#define XSCALE 320
#define YSCALE 240


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

BITMAPINFO stBMPInfo;
HBITMAP hBack;

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 ical;

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)
{
 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
  , 0, 0, XSCALE, YSCALE
  , hWnd, 0);
 if (NULL == hCamera) //창을 못만들어서 뜨는 에러
 {
  MessageBox(hWnd, TEXT("창을 열수 없음"), TEXT("밝명에러"), MB_OK);
 }

 bRet = capDriverConnect(hCamera, 0); //화면을 카메라와 연결한다.(USB장치연결) //0:카메라마다 고유번호
 if (FALSE == bRet) //카메라가 없거나 드라이버가 안잡힘.
 {
  MessageBox(hWnd, TEXT("카메라가 없음."), TEXT("밝명에러"), MB_OK);
 }

 capPreviewRate(hCamera, 1);    //화면에 보일 속도
 capGetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo)); //비디오 형식을 bInfo에 저장

 stBMPInfo.bmiHeader.biWidth = XSCALE; //가로, 세로 길이 set
 stBMPInfo.bmiHeader.biHeight = YSCALE;

 capSetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));//bInfo 출력준비
 capSetCallbackOnFrame(hCamera, capture);//비디오 라이브러리에서 함수호출
 capPreview(hCamera, TRUE);    // 영상화면 출력//TRUE:Preview flag

 hdc = GetDC(hWnd);
 ReleaseDC(hWnd, hdc);
 return 0;
}
LRESULT capture(HWND hWpWnd, LPVIDEOHDR lpVHdr)//구조체 정보가 실려온다.
{
 HDC hdc;
 INT iXCnt;
 INT iYCnt;

 static BYTE vData[XSCALE*YSCALE * 3];

 hdc = GetDC(hWnd);

 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;
   }
    vData[ical + 0] = 255;
    vData[ical + 1] = 0;
    vData[ical + 2] =0;

  }
 }

 StretchDIBits(hdc
  , XSCALE, 0
  , XSCALE, YSCALE
  , 0, 0
  , XSCALE, YSCALE
  , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY);

 

 ReleaseDC(hWpWnd, hdc);

 

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

 hdc = BeginPaint(hWnd, &ps);
 MemDC = CreateCompatibleDC(hdc);
 hBack = LoadBitmap(g_hInst, MAKEINTRESOURCE(IDB_BITMAP1));
 BitBlt(hdc, 0, 0, 123, 160, MemDC, 0, 0, SRCCOPY);
 DeleteObject(hBack);
 DeleteDC(MemDC);

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

 PostQuitMessage(0);
 return 0;
}

 

 

728x90