#include <windows.h> #include <Vfw.h>
#define XSCALE 320 #define YSCALE 240 #define SPACE 20 #define XGRP 256 #define YGRP 256
// alpha 값 #define MALPHA 170 #define GALPHA 20 ////실제로 사용하는 알파값들 #define HALPHA (MALPHA+GALPHA) #define LALPHA (MALPHA-GALPHA) #define GAB XSCALE*YSCALE * 3
typedef struct _msgmap { UINT uiMsg; LRESULT(*fp)(HWND, WPARAM, LPARAM); } stMsgMap;
LRESULT On_Paint(WPARAM, LPARAM); LRESULT On_Create(WPARAM, LPARAM); LRESULT On_Destroy(WPARAM, LPARAM); LRESULT capture(HWND, LPVIDEOHDR);
stMsgMap MsgMap[] = { { WM_PAINT, On_Paint }, { WM_CREATE, On_Create }, { WM_DESTROY, On_Destroy }, { WM_NULL, 0 } };
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
static BYTE BData[XSCALE*YSCALE * 3]; BITMAPINFO stBMPInfo; HINSTANCE g_hInst; LPSTR lpszClass = TEXT("VFW ALPHA"); HWND hWnd; HBITMAP Histo;
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 On_Create(WPARAM wParam, LPARAM lParam) { HDC hdc; HDC MemDC; HWND hCamera; BOOL bRet; DWORD Dwgo; HANDLE hdl; BITMAPFILEHEADER stBFHead; BITMAPINFOHEADER stBFInfo;
//절차가있다.윈도우 생성 hdl = CreateFile(L"weather.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hdl == NULL) { MessageBox(hWnd, TEXT("날씨비트맵생성실패"), TEXT("에러"), MB_OK); } bRet = ReadFile(hdl, BData, GAB, &Dwgo, NULL); if (bRet == NULL) { MessageBox(hWnd, TEXT("날씨읽기실패"), TEXT("에러"), MB_OK); }
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
CloseHandle(hdl); return 0; }
LRESULT On_Paint(WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; hdc = BeginPaint(hWnd, &ps); EndPaint(hWnd, &ps); return 0; } LRESULT On_Destroy(WPARAM wParam, LPARAM lParam) { PostQuitMessage(0); return 0; }
LRESULT capture(HWND hWpWnd, LPVIDEOHDR lpVHdr)//구조체 정보가 실려온다. { HDC hdc; static BYTE vData[XSCALE*YSCALE * 3];
UINT iCntX; UINT iCntY; UINT iCal;
hdc = GetDC(hWnd);
//영상복사 //memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength); for (iCntY = 0; iCntY < YSCALE; ++iCntY) { for (iCntX = 0; iCntX < XSCALE; ++iCntX) { //iCal = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX)]; vData[3 * (XSCALE * iCntY + iCntX) + 2] = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 2]; vData[3 * (XSCALE * iCntY + iCntX) + 1] = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 1]; vData[3 * (XSCALE * iCntY + iCntX) + 0] = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 0]; if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 0]) { continue; } if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 0]) { continue; } if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 1]) { continue; } if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 1]) { continue; } if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 2]) { continue; } if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 2]) { continue; } vData[3 * (XSCALE * iCntY + iCntX) + 0] = BData[3 * (XSCALE * iCntY + iCntX) + 0]; vData[3 * (XSCALE * iCntY + iCntX) + 1] = BData[3 * (XSCALE * iCntY + iCntX) + 1]; vData[3 * (XSCALE * iCntY + iCntX) + 2] = BData[3 * (XSCALE * iCntY + iCntX) + 2]; } }
StretchDIBits(hdc , XSCALE + SPACE, 0 , XSCALE, YSCALE , 0, 0 , XSCALE, YSCALE , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY);
ReleaseDC(hWnd, hdc); return 0; }
|