========================================================================================================================================================================
영상 처리
========================================================================================================================================================================
#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>
#pragma comment(lib, "vfw32.lib") //vfw32 라이브러리 포함
#define ID_BCAPTURE 101
#define WIDTH4(width) ((width+3)>>2)<<2
========================================================================================================================================================================
========================================================================================================================================================================
// 폭을 4의배수로 맞추는작업이다. RGB에서의 폭을맞출때는 width*3+3이 들어가지만 여기서는 width *3을 뺐다 흑백이기때문에
// 전체적으로 곱하기 3을 하게되면 빈공간이 더늘어나기때문에 곱하기 3을하질 않는다. 이작업을하지않으면 이미지의 폭이 맞지않게
// 되어서 이미지 뒤틀림이 있기때문에 꼭 해줘야대는작업이다.
디버깅을 하였을때 이미지의 사이즈를 확인해보았다 위와같이 define을 설정해주게되면 저렇게 뒤틀림이없는 이미지를주게된다.
========================================================================================================================================================================
========================================================================================================================================================================
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK FramInfo(HWND, LPVIDEOHDR); // 콜백 함수
TCHAR str[10]; //정수데이터값 확인을 위한 버퍼
unsigned char Menuflag; //인터페이스 선택
HINSTANCE g_hInst;
HWND hWndMain;
HWND hVFW;
HWND Hwndmain;
HBITMAP hBit;
BITMAPINFO Bm; //비트맵 정보를 가짐
//영상 메모리
int Action;
LPCTSTR lpszClass = TEXT("VFW 기본 예제");
BYTE *imageData;
BITMAPFILEHEADER bmfh;
BITMAPINFO *binfo;
BYTE *cpyData;
// 8bit 흑백영상으로 바꾸어줄 변수
BITMAPFILEHEADER bmfh8;
BITMAPINFO *binfo8;
BYTE *Data8bit;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCndParam, int nCmdShow)
{
HWND hWnd;
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;
WndClass.lpszClassName = lpszClass;
WndClass.lpszMenuName = NULL;
WndClass.style = CS_HREDRAW|CS_VREDRAW;
RegisterClass(&WndClass);
//영상을 보여줄 윈도우 생성
hWnd = CreateWindow(lpszClass, lpszClass,WS_OVERLAPPEDWINDOW|WS_CAPTION,200,200,
300, 300, NULL, (HMENU)NULL, hInstance, NULL);
hWndMain = hWnd;
ShowWindow(hWnd, SW_SHOW);
while(GetMessage(&Message, 0,0,0))
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
HDC Hdc;
FILE *file;
LONG width, height;
int count=0;
switch(iMessage)
{
case WM_CREATE:
Hwndmain = hWnd;
Hdc = GetDC(hWnd);
file=fopen("test.bmp","rb");
if(file==NULL)
return 0;
//BITMAPINFO
binfo = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*256));
//초기화
memset(binfo,0,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
//이미지 데이터가 보관될 메모리 할당
//비트맵 파일 헤더 읽음
fread(&bmfh,sizeof(BITMAPFILEHEADER),1,file);
//비트맵 인포 헤더를 읽음
fread(&(binfo->bmiHeader),sizeof(BITMAPINFOHEADER),1,file);
imageData = (BYTE*)malloc(binfo->bmiHeader.biSizeImage);
//이미지 데이터를 읽음
fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);
fclose(file);
// 8bit 흑백영상으로 바꾸어줌
{
LONG width4=binfo->bmiHeader.biWidth;
width4 = WIDTH4(width4);
binfo8 = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+(sizeof(RGBQUAD)*256));
binfo8->bmiHeader.biBitCount = 8; //8비트 흑백
binfo8->bmiHeader.biPlanes =1; //비트 플레인수 항상 1
binfo8->bmiHeader.biXPelsPerMeter =binfo->bmiHeader.biXPelsPerMeter; //가로 해상도 0
binfo8->bmiHeader.biYPelsPerMeter =binfo->bmiHeader.biYPelsPerMeter; //세로 해상도 0
binfo8->bmiHeader.biHeight = binfo->bmiHeader.biHeight; //높이
binfo8->bmiHeader.biWidth = binfo->bmiHeader.biWidth; //폭
binfo8->bmiHeader.biCompression = 0; //압축하지 않은 데이터
binfo8->bmiHeader.biSizeImage = width4*binfo->bmiHeader.biHeight; //영상의 크기 지정 //꼭 체크
binfo8->bmiHeader.biClrUsed = binfo8->bmiHeader.biClrImportant = 256;
//실제 사용 색상수와 실제 중요 색상수는 256으로 설정
binfo8->bmiHeader.biSize=sizeof(binfo8->bmiHeader); //이 구조체의 크기
for(unsigned int i=0; i<256; i++){
binfo8->bmiColors[i].rgbRed = binfo8->bmiColors[i].rgbBlue = binfo8->bmiColors[i].rgbGreen = i;
binfo8->bmiColors[i].rgbReserved =0;
}
//흑백으로 영상을 처리한다는 for문이다 1,1,1 2,2,2 이런식으로 RGB가 설정이되면 회색 즉 흑백영상으로 출력이 되게된다.
Data8bit = (BYTE*)malloc(binfo8->bmiHeader.biSizeImage); //동적할당을 하였다.
memset(Data8bit,254,binfo8->bmiHeader.biSizeImage); // 초기화하는작업이다.
LONG oldheight = binfo->bmiHeader.biHeight;
LONG oldWidth = WIDTH4(binfo->bmiHeader.biWidth*3);
LONG count=0;
for(height=0; height<binfo8->bmiHeader.biHeight; height++){
for(width=0; width<binfo->bmiHeader.biWidth; width++){
count= (imageData[(height*oldWidth)+width*3+0]+
imageData[(height*oldWidth)+width*3+1]+
imageData[(height*oldWidth)+width*3+2])/3;
Data8bit[(height*width4)+width]=count; //흑백이기에 /3을 하고 count 설정한값을 Data8bit로 넣는다.
}
}
BITMAPFILEHEADER bfh8; //흑백영상을 위한 파일 헤더를 많듬
bfh8.bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
bfh8.bfReserved1=0;
bfh8.bfReserved2=0;
bfh8.bfSize =bfh8.bfOffBits + binfo8->bmiHeader.biSizeImage;
bfh8.bfType = 0x4d42;
fopen("8bit.bmp","wb"); //흑백영상을 bmp파일로 저장
fwrite(&bfh8,sizeof(BITMAPFILEHEADER),1,file);
fwrite(&(binfo8->bmiHeader),sizeof(BITMAPINFOHEADER),1,file);
fwrite(&(binfo8->bmiColors),sizeof(RGBQUAD),256,file);
fwrite(Data8bit,sizeof(BYTE),binfo8->bmiHeader.biSizeImage,file);
fclose(file);
}
return 0;
case WM_COMMAND:
return 0;
case WM_LBUTTONDOWN:{
width = (unsigned int)binfo->bmiHeader.biWidth;
height = (unsigned int)binfo->bmiHeader.biHeight;
Hdc = GetDC(hWnd);
MoveWindow(hWndMain,200,200,width+binfo8->bmiHeader.biWidth+15,height,true);
SetDIBitsToDevice(Hdc,0,0,width,height,
NULL,NULL,NULL,height,imageData,
binfo,DIB_RGB_COLORS);
if(Data8bit!=NULL){
SetDIBitsToDevice(Hdc,width+5,0,binfo8->bmiHeader.biWidth,height,
NULL,NULL,NULL,height,Data8bit,
binfo8,DIB_RGB_COLORS);
}
ReleaseDC(hWnd,Hdc);
return 0;}
case WM_DESTROY:
free(imageData);
free(binfo);
if(Data8bit!=NULL)
free(Data8bit);
if(binfo8!=NULL)
free(binfo8);
PostQuitMessage(0);
return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}
'코스웨어 > 10년 시스템제어' 카테고리의 다른 글
쿼드콥터 연구 자료 - 외국 (2) | 2010.08.04 |
---|---|
2번 김동수~~~ 업무일지~~(영상, 자바) (0) | 2010.06.24 |
RFID 프로젝트 <출입국 관리 시스템> - 신관식, 김락영, 김진웅, 배정훈 (0) | 2010.06.16 |
[시스템제어] 6월9일 업무일지_2 20번 이창민 (0) | 2010.06.11 |
[시스템제어] 6월 9일 업무일지_1 20번 이창민 (0) | 2010.06.11 |
[시스템제어] 19번 이상은 (0) | 2010.06.08 |
6월 4일 보고서 17번 유성민 (1) | 2010.06.04 |
시스템제어-안태민(16번)_6월3일 (0) | 2010.06.03 |