728x90
반응형
■ WIN32API
■ 그래프 출력
그래프의 배경이 검정색으로 나오기 때문에 먼저 흰색으로 바꿔준다.
PatBlt는 이미 생성된 MemDC와 교차하는 영역을 어떤 색상으로 표현할지 지정하는 함수이다.
위 코드의 2~4번째 인자가 그리는 영역과 MemDC를 비교하고
겹치는 영역의 색상을 반전시키던가, 투명화하던가, 흰색으로 칠하던가 하는 함수이다.
▲ 교차영역을 흰색으로 칠하였다.
▲ X, Y축을 그린 상황
#include <windows.h> |
■ 라이브러리 땡기기
또는
#pragma comment(lib, "vfw32.lib")
■ capCreateCaptureWindow 함수원형
■ capDriverConnect 함수원형
LRESULT On_Create(WPARAM wParam , LPARAM lParam )
{
HDC hdc;
HWND hCamera;
BOOL bRet;
BITMAPINFO BInfo;
hdc = GetDC(hWnd);
// 화면을 띄울 창 마련
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, &BInfo, sizeof(BInfo));
// 카메라 해상도 셋팅
BInfo.bmiHeader.biWidth = XSCALE;
BInfo.bmiHeader.biHeight = YSCALE;
// BInfo를 hCamera에 저장
capSetVideoFormat(hCamera, &BInfo, sizeof(BInfo));
//capSetCallbackOnFrame(hCamera, ????);
// 출력
capPreview(hCamera, TRUE);
ReleaseDC(hWnd, hdc);
return 0;
}
■ 영상 두배로 띄우기 테스트
지금까지는 단순히 카메라 영상을 띄우는 것만 가능하다.
카메라영상을 받아와서 데이터를 조작하기 위해서는 콜백함수(capDriverConnect)를 사용해야한다.
■ capSetCallBackOnFrame 함수원형
■ StrechDIBits 함수원형
■ VIDEOHDR 구조체 원형
▲ LPBYTE - 1바이트단위 포인터
LPBYTE lpData가 실제로 화면이다
▲ 12번째 인자 iUsage
■ CallBack 함수 capture()구현
LRESULT capture(HWND hwpWnd , LPVIDEOHDR lpVHdr )
{
HDC hdc;
hdc = GetDC(hWnd);
StretchDIBits(hdc
, XSCALE
, 0
, XSCALE
, YSCALE
, 0
, 0
, XSCALE
, YSCALE
, lpVHdr->lpData
, &stBMPInfo
, DIB_RGB_COLORS
, SRCCOPY);
ReleaseDC(hWnd, hdc);
return 0;
}
■ RGB별로 출력
LRESULT capture(HWND hwpWnd , LPVIDEOHDR lpVHdr )
{
HDC hdc;
unsigned int uiCntX;
unsigned int uiCntY;
unsigned char cBuf[20];
static BYTE vData[XSCALE * YSCALE * 3];
hdc = GetDC(hWnd);
memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
for (uiCntX = 0; uiCntX < XSCALE; uiCntX++)
{
for (uiCntY = 0; uiCntY < YSCALE; uiCntY++)
{
//*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 0) = 0; // B
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 1) = 0; // G
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 2) = 0; // R
}
}
StretchDIBits(hdc
, XSCALE
, 0
, XSCALE
, YSCALE
, 0
, 0
, XSCALE
, YSCALE
, vData
, &stBMPInfo
, DIB_RGB_COLORS
, SRCCOPY);
/////////////////////////////////////////////////////////////////////////
memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
for (uiCntX = 0; uiCntX < XSCALE; uiCntX++)
{
for (uiCntY = 0; uiCntY < YSCALE; uiCntY++)
{
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 0) = 0; // B
//*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 1) = 0; // G
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 2) = 0; // R
}
}
StretchDIBits(hdc
, 0
, YSCALE
, XSCALE
, YSCALE
, 0
, 0
, XSCALE
, YSCALE
, vData
, &stBMPInfo
, DIB_RGB_COLORS
, SRCCOPY);
/////////////////////////////////////////////////////////////////////////
memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
for (uiCntX = 0; uiCntX < XSCALE; uiCntX++)
{
for (uiCntY = 0; uiCntY < YSCALE; uiCntY++)
{
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 0) = 0; // B
*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 1) = 0; // G
//*(vData + (uiCntY * XSCALE + uiCntX) * 3 + 2) = 0; // R
}
}
StretchDIBits(hdc
, XSCALE
, YSCALE
, XSCALE
, YSCALE
, 0
, 0
, XSCALE
, YSCALE
, vData
, &stBMPInfo
, DIB_RGB_COLORS
, SRCCOPY);
//wsprintf(cBuf, TEXT("[%u]"), lpVHdr->dwBufferLength);
//SetWindowText(hWnd, cBuf);
ReleaseDC(hWnd, hdc);
return 0;
}
728x90
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20151125 윤재희 #10. 히스토그램, 알파값 (6) | 2015.11.25 |
---|---|
20151125 수업 / WinAPI_10 / 영상처리-알파값 (6) | 2015.11.25 |
20151125 - 권오민 - WinAPI 10일차 (4) | 2015.11.25 |
20151121 김태현 WinAPI 8일차 동영상 (5) | 2015.11.25 |
20151124_안향진_API_9 (6) | 2015.11.24 |
20151124 윤재희 #9 히스토그램, 캠 영상처리 (6) | 2015.11.24 |
20151124_박서연_일일업무일지_WinAPI(9) (7) | 2015.11.24 |
2015.11.24_개인업무일지_[Win32API #9]_이량경_히스토그램 그래프,VFW (7) | 2015.11.24 |