728x90
반응형
■ WIN32API
■ 영상 밝기 그래프
#include <windows.h> ■ 알파값 처리 |
알파값이란? 색깔을 투명한 색상으로 변경
일기예보 보면...
실제로 캐스터의 배경은 빈화면이다.
방송에서 배경을 비트맵으로 대체시켜 보여주는 것이다.
칠판을 다른색깔로 대체시켜야한다.
그러러면 특정한 칠판 색깔을 찾아내야한다.
칠판에서 가장 많이 분포된 값을 알파값으로 사용한다.
영상처리도 임베디드시스템에서 활용된다.
품질검사 같은 부분.
▲ GAP 이 10일때 +10 ~ -10의 오차까지 커버한다.
▲ GAP 이 20일때 +20 ~ -20의 오차까지 커버한다.
#ifndef __SMART_H__
#define __SMART_H__
#define XSCALE 320
#define YSCALE 240
#define XGRAPH 256
#define YGRAPH 256
#define MALPHA 177
#define GALPHA 25 // gap
#define HALPHA (MALPHA + GALPHA)
#define LALPHA (MALPHA - GALPHA)
#endif // __SMART_H__
#include <windows.h>
#include <Vfw.h>
#include "smart.h"
//#pragma comment (lib, "vfw32.lib")
typedef struct _stMSG_Map
{
UINT uiMSG;
LRESULT(*fp)( WPARAM, LPARAM);
}stMSG_Map;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT On_Paint(WPARAM , LPARAM );
LRESULT On_Create(WPARAM , LPARAM );
LRESULT On_Destroy(WPARAM , LPARAM );
LRESULT capture(HWND , LPVIDEOHDR );
HWND hWnd;
BITMAPINFO stBMPInfo;
HINSTANCE g_hInst;
static HBITMAP hBack;
BITMAPFILEHEADER stBFHead;
BITMAPINFOHEADER stBFInfo;
unsigned int uiPad;
static BYTE BData[XSCALE * YSCALE * 3];
LPSTR lpszClass = TEXT ("영상처리" );
stMSG_Map stMap[] = {
{ WM_PAINT, On_Paint },
{ WM_CREATE, On_Create },
{ WM_DESTROY, On_Destroy },
{ WM_NULL, 0 }
};
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 On_Create(WPARAM wParam , LPARAM lParam )
{
HDC hdc;
HWND hCamera;
BOOL bRet;
HANDLE hFile;
DWORD dwCnt;
hdc = GetDC(hWnd);
hBack = CreateCompatibleBitmap(hdc, XSCALE, YSCALE); // 비트맵을 생성
// 화면을 띄울 창 마련
hCamera = capCreateCaptureWindow(TEXT ("smart" ), WS_CHILD | WS_VISIBLE , 0, 0, XSCALE , YSCALE , hWnd, 0);
if (NULL == hCamera)
{
MessageBox(hWnd, TEXT ("윈도우를 생성할 수 없습니다"), TEXT("에러"), MB_OK);
PostQuitMessage(0);
}
// 카메라와 연결 2번째 인자는 장착된 카메라 갯수번호
bRet = capDriverConnect(hCamera, 0);
if (FALSE == bRet)
{
MessageBox(hWnd, TEXT ("카메라를 연결할 수 없습니다"), TEXT("에러"), MB_OK);
PostQuitMessage(0);
}
// 화면에 보이는 속도
capPreviewRate(hCamera, 1);
// hCamera의 정보를 BInfo에 저장
capGetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));
// 카메라 해상도 셋팅
stBMPInfo.bmiHeader.biWidth = XSCALE;
stBMPInfo.bmiHeader.biHeight = YSCALE;
// BInfo를 hCamera에 저장
capSetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));
capSetCallbackOnFrame(hCamera, capture);
// 출력
capPreview(hCamera, TRUE);
hFile = CreateFile(TEXT ("s.bmp" )
, GENERIC_READ
, 0
, NULL
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
MessageBox(hWnd, TEXT ("파일을 열 수 없습니다." ), TEXT("에러" ), MB_OK );
PostQuitMessage(0);
}
bRet = ReadFile(hFile, &stBFHead, sizeof(stBFHead), &dwCnt, NULL);
if (FALSE == bRet)
{
MessageBox(hWnd, TEXT ("파일헤더를 열 수 없습니다."), TEXT( "에러"), MB_OK );
CloseHandle(hFile);
PostQuitMessage(0);
}
uiPad = (stBFInfo.biWidth % 4);
bRet = ReadFile(hFile, &stBFInfo, sizeof(stBFInfo), &dwCnt, NULL);
if (FALSE == bRet)
{
MessageBox(hWnd, TEXT ("인포헤더를 열 수 없습니다."), TEXT( "에러"), MB_OK );
CloseHandle(hFile);
PostQuitMessage(0);
}
if (stBFInfo.biWidth!= XSCALE)
{
MessageBox(hWnd, TEXT ("가로가 320픽셀이 아닙니다."), TEXT( "에러"), MB_OK );
CloseHandle(hFile);
PostQuitMessage(0);
}
if (stBFInfo.biHeight!= YSCALE)
{
MessageBox(hWnd, TEXT ("세로가 240픽셀이 아닙니다."), TEXT( "에러"), MB_OK );
CloseHandle(hFile);
PostQuitMessage(0);
}
_llseek(hFile, stBFHead.bfOffBits, SEEK_SET);
bRet = ReadFile(hFile, BData, stBFInfo.biSizeImage, &dwCnt, NULL);
if (FALSE == bRet)
{
MessageBox(hWnd, TEXT ("데이터 Read 실패" ), TEXT("에러" ), MB_OK );
CloseHandle(hFile);
PostQuitMessage(0);
}
CloseHandle(hFile);
ReleaseDC(hWnd, hdc);
return 0;
}
LRESULT On_Destroy(WPARAM wParam , LPARAM lParam )
{
PostQuitMessage(0);
return 0;
}
LRESULT capture(HWND hwpWnd , LPVIDEOHDR lpVHdr )
{
HDC hdc;
unsigned int uiCntX;
unsigned int uiCntY;
unsigned char cBuf[20];
int iCal;
PAINTSTRUCT ps;
static BYTE vData[XSCALE * YSCALE * 3];
hdc = GetDC(hWnd);
//memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
for (uiCntY = 0; uiCntY < YSCALE; uiCntY++)
{
for (uiCntX = 0; uiCntX < XSCALE; uiCntX++)
{
iCal = (uiCntY * XSCALE * 3) + (uiCntX * 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] = BData[iCal + 0];
vData[iCal + 1] = BData[iCal + 1];
vData[iCal + 2] = BData[iCal + 2];
}
}
StretchDIBits(hdc
, XSCALE
, 0
, XSCALE
, YSCALE
, 0
, 0
, XSCALE
, YSCALE
, vData
, &stBMPInfo
, DIB_RGB_COLORS
, SRCCOPY);
ReleaseDC(hWnd, hdc);
return 0;
}
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151125_일일업무보고서_박서연_WinAPI(10) (2) | 2015.11.26 |
---|---|
20151126_김태현_winapi 10일차 (6) | 2015.11.26 |
20151125_주재민_API_10 (6) | 2015.11.26 |
20151125_안향진_API_10 (6) | 2015.11.26 |
2015.11.25_개인업무일지_[Win32API #10]_이량경_알파값 (4) | 2015.11.25 |
20151125 - 홍준모 업무일지 영상처리 10일째 - 배경처리(알파값 : ex)일기 예보) (6) | 2015.11.25 |
20151125 강동조 개인업무일지 API(작성중) (4) | 2015.11.25 |
20151125 업무일지 -여지윤- WIN32Api 10 (5) | 2015.11.25 |