과제 1
화면에 비트맵을 방향키대로 조정하기
1: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)2: {3: switch(iMessage)
4: {5: case WM_CREATE:
6: hdc = GetDC(hWnd);7:8: SendMessage(hWnd,WM_PAINT,0,0);9:10: hVfw = capCreateCaptureWindow(TEXT("CCC"),WS_CHILD|WS_VISIBLE,0,0,320,240,hWnd,0); //창만들기11: capDriverConnect(hVfw,0); //창을 장치와 연결
12:13: capPreviewRate(hVfw,1); //카메라보이는 속도
14: capGetVideoFormat(hVfw,&BInfo,sizeof(BITMAPINFO)); //비디오형식 정보를 BITMAPINFO에 넣기15: //가로세로셋팅
16: BInfo.bmiHeader.biWidth = 320;17: BInfo.bmiHeader.biHeight = 240;18: //BInfo 출력 준비
19: capSetVideoFormat(hVfw,&BInfo,sizeof(BITMAPINFO));
20: capSetCallbackOnFrame(hVfw, Emb_Draw); //호출함수 주소
21: capPreview(hVfw,TRUE); //화면 띄우기 FALSE는 화면을 띄우지 않음
22:23: return 0;
24:25: case WM_KEYDOWN:
26: switch(wParam)
27: {28: case VK_LEFT:
29: if(x > -120)
30: {31: x-=8;32: }33: break;
34: case VK_RIGHT:
35: if(x < 120)
36: {37: x+=8;38: }39: break;
40: case VK_UP:
41: if(y > -90)
42: {43: y-=8;44: }45: break;
46: case VK_DOWN:
47: if(y < 90)
48: {49: y+=8;50: }51: break;
52: }53: InvalidateRect(hWnd,NULL,TRUE);54: return 0;
55:56: case WM_DESTROY:
57: ReleaseDC(hWnd,hdc);58: PostQuitMessage(0);59: return 0;
60: }61:62: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
63: }64:65: LRESULT CALLBACK Emb_Draw(HWND hWnd, LPVIDEOHDR lp)66: {67: int ix = 0;
68: int iy = 0;
69: int iCnt = 0;
70: int iHeader = 54; //비트맵의 헤더 54바이트71:72: hFile = CreateFile("skara.bmp",GENERIC_READ,0,NULL, //파일 열기73: OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);74:75: ReadFile(hFile,buf,sizeof(buf),&dwRead,NULL);
76:77: for(iy=240; iy>0; iy--)
78: {79: for(ix=0; ix<320; ix++)
80: {81:82: if(iy>=90+y && iy<150+y && ix>=120+x && ix<200+x)
83: {84: lp->lpData[iCnt+2] = buf[iHeader+2];85: lp->lpData[iCnt+1] = buf[iHeader+1];86: lp->lpData[iCnt] = buf[iHeader];87: iHeader = iHeader+3;88: }89: iCnt = iCnt+3; //RGB 3칸확보하고 다시 돌리기
90: }91: }92: CloseHandle(hFile); //파일 닫기
93:94: return 0;
95: }
과제 2
1: #include <windows.h>2: #include <vfw.h> //video for window
3:4: #pragma comment(lib,"vfw32.lib") //수동으로 라이브러리 추가 작업5:6: HDC hdc;7: HBITMAP HBm;8: BITMAPINFO BInfo;9: HWND hWnd,hVfw;10: HWND ghWnd;11: HANDLE hFile;12: DWORD dwRead;13: char buf[321*241*3]; //1은 여유14:15: LRESULT CALLBACK Emb_Draw(HWND hWnd, LPVIDEOHDR lp);16:17: /* 고정 형식 */
18: LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //메시지 처리 함수
19: BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);20:21: HINSTANCE g_hInst; //instance 전역 선언
22: LPCTSTR lpszClass = TEXT("First"); //윈도클래스 이름 정의23:24: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
25: LPSTR lpszCmdParam, int nCmdShow) //시작점26: {27: HWND hWnd;28: MSG Message; //MSG 구조체 사용
29: WNDCLASS WndClass; //WNDCLASS 구조체 사용
30: g_hInst=hInstance; //이 윈도클래스를 등록하는 프로그램의 번호
31:32: /*WndClass 정의(윈도우의 기반이 되는 클래스를 정의한다. 즉, 만들고자 하는 윈도우의 속성을 정의)*/
33: WndClass.cbClsExtra = 0; //예약 영역, 사용하지 않을 경우 0으로 지정
34: WndClass.cbWndExtra = 0; //예약 영역
35: WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //윈도우의 배경 색상을 지정
38: WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //윈도우가 사용할 커서를 지정
39: WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);//윈도우가 사용할 아이콘을 지정
41: WndClass.hInstance = hInstance;42: WndClass.lpfnWndProc = WndProc; //윈도우의 메시지 처리함수를 지정
43: WndClass.lpszClassName = lpszClass; //윈도우 클래스의 이름을 문자열로 정의
44: WndClass.lpszMenuName = NULL; //프로그램이 사용할 메뉴를 지정(여기선 메뉴 사용 안함)
45: WndClass.style = CS_HREDRAW | CS_VREDRAW; //윈도우 스타일 정의
46:47: /*윈도우 클래스 등록*/
48: RegisterClass(&WndClass);49:50: /*메모리상에 윈도우 생성*/
51: hWnd=CreateWindow(lpszClass, /*타이틀바문자열*/TEXT("Test"), /*윈도우스타일*/WS_OVERLAPPEDWINDOW|WS_HSCROLL|WS_VSCROLL,52: /*윈도창위치*/CW_USEDEFAULT, /*윈도창위치*/CW_USEDEFAULT, /*폭*/CW_USEDEFAULT, /*높이*/CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance,NULL);53: //(윈도클래스이름,타이틀바에나타날문자열,윈도우스타일,CW사용하면 운영체제가 화면크기에 맞게 알아서 조절, ....)
54:55: ShowWindow(hWnd, nCmdShow); //CreateWindow함수가 리턴한 핸들을 이용하여 출력(윈도우를 화면에 표시)
56:57: /*사용자로부터의 메시지 처리(메시지 루프)*/
58: while(GetMessage(&Message, NULL, 0, 0)) //메시지 큐에서 읽어옴59: { //GetMessage가 WM_QUIT면 False리턴
60: TranslateMessage(&Message); //키보드 입력 처리
61: DispatchMessage(&Message); //큐에서 꺼낸 메시지를 WndProc함수의 iMessage로 전달
62: }63:64: return(int)Message.wParam; //메시지 루프 종료후 이 프로그램을 실행시킨 OS로 리턴65: }66:67: LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)68: {69: switch(iMessage)
70: {71: case WM_CREATE:
72: hdc = GetDC(hWnd);73: ghWnd = hWnd;74:75: SendMessage(hWnd,WM_PAINT,0,0);76:77: hVfw = capCreateCaptureWindow(TEXT("CCC"),WS_CHILD|WS_VISIBLE,320,0,320,240,hWnd,0); //창만들기78: capDriverConnect(hVfw,0); //창을 장치와 연결
79:80: capPreviewRate(hVfw,1); //카메라보이는 속도
81: capGetVideoFormat(hVfw,&BInfo,sizeof(BITMAPINFO)); //비디오형식 정보를 BITMAPINFO에 넣기82: //가로세로셋팅
83: BInfo.bmiHeader.biWidth = 320;84: BInfo.bmiHeader.biHeight = 240;85: //BInfo 출력 준비
86: capSetVideoFormat(hVfw,&BInfo,sizeof(BITMAPINFO));
87: capSetCallbackOnFrame(hVfw, Emb_Draw); //호출함수 주소
88: capPreview(hVfw,TRUE); //화면 띄우기 FALSE는 화면을 띄우지 않음
89:90: return 0;
91:92: case WM_DESTROY:
93: ReleaseDC(hWnd,hdc);94: PostQuitMessage(0);95: return 0;
96: }97:98: return(DefWindowProc(hWnd, iMessage, wParam, lParam));
99: }100:101: LRESULT CALLBACK Emb_Draw(HWND hWnd, LPVIDEOHDR lp)102: {103: int ix = 0;
104: int iy = 0;
105: int iCnt = 0;
106: int iHeader = 54; //비트맵의 헤더 54바이트107: char cBuf[1024];
108: unsigned char R,G,B;109:110: hFile = CreateFile("kara.bmp",GENERIC_READ,0,NULL, //파일 열기111: OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);112:113: ReadFile(hFile,buf,sizeof(buf),&dwRead,NULL);
114:115: for(iy=240; iy>0; iy--)
116: {117: for(ix=0; ix<320; ix++)
118: {119: SetPixel(hdc,ix,iy-1,RGB(lp->lpData[iCnt+2],lp->lpData[iCnt+1],lp->lpData[iCnt])); //우상영상
120: R = lp->lpData[iCnt+2];121: G = lp->lpData[iCnt+1];122: B = lp->lpData[iCnt];123:124: if(iy == 120 && ix == 160) //RGB값 창제목에 나타내기125: {126: wsprintf(cBuf,TEXT("R:%d, G:%d, B:%d"), lp->lpData[iCnt+2],lp->lpData[iCnt+1],lp->lpData[iCnt]);
127: SetWindowText(ghWnd,cBuf);128: }129:130: if(R > 135 && R < 185) //160 평균값이라 치고 오차 +-25131: {132: lp->lpData[iCnt+2] = buf[iHeader+2]; //lp->lpData[iCnt+2] = 255; 빨강
133: lp->lpData[iCnt+1] = buf[iHeader+1];134: lp->lpData[iCnt] = buf[iHeader];135: }136: iCnt = iCnt+3;137: iHeader = iHeader+3;138: }139: }140: CloseHandle(hFile); //파일 닫기
141:142: return 0;
143: }
1단계 창제목에 캠에 비추는 화면 RGB값 나타내기
if(iy == 120 && ix == 160) //RGB값 창제목에 나타내기
{
wsprintf(cBuf,TEXT("R:%d, G:%d, B:%d"), lp->lpData[iCnt+2],lp->lpData[iCnt+1],lp->lpData[iCnt]);
SetWindowText(ghWnd,cBuf);
}
2단계 화이트보드에 색상을 빨간색으로 나오게 하기
대충 중간값을 160이라치고 오차를 +-25정도로 둠
3단계 임의의 비트맵을 빨간색부분에 넣기(일기예보의 예)
if(R > 135 && R < 185) //160 평균값이라 치고 오차 +-25
{
lp->lpData[iCnt+2] = buf[iHeader+2]; //lp->lpData[iCnt+2] = 255; 빨강
lp->lpData[iCnt+1] = buf[iHeader+1];
lp->lpData[iCnt] = buf[iHeader];
}
'Computer' 카테고리의 다른 글
영상처리하기 (0) | 2011.11.16 |
---|---|
리눅스(linux) 단축키 (0) | 2011.06.22 |
RISC/CISC (0) | 2011.04.18 |
폰 노이만 / 하버드 구조 (1) | 2011.04.18 |
vi(visual edit) 명령어 (0) | 2011.04.11 |