본문 바로가기

Computer

영상처리 (11/24)

과제 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 평균값이라 치고 오차 +-25
131: 			{
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값 나타내기

1단계

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단계 화이트보드에 색상을 빨간색으로 나오게 하기

2단계

대충 중간값을 160이라치고 오차를 +-25정도로 둠

 

 

3단계 임의의 비트맵을 빨간색부분에 넣기(일기예보의 예)

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