6월10일 RFID(프로젝트) 영상처리(흑백영상)

2010. 6. 10. 13:532010년/6월

영상처리
그림을 흑백으로 띄우는게 아니라..
아예 8비트 흑백으로 만들어버린다. 그렇기때문에 필요한것이
바로 팔레트를 사용해야한다.

#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>


#pragma comment(lib, "vfw32.lib"//vfw32 라이브러리 포함

#define WIDTH4(width) ((width+3)>>2)<<2 //가장중요(폭을 4배수로 맞추는것이다.
#define ID_BCAPTURE 101

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;    //비트맵 정보를 가짐
HDC Hdc;
//비트맵의 정보 
BYTE *imageData,*Dataimage,*byteimage;
BITMAPFILEHEADER *bmfh;
BITMAPFILEHEADER *bmfh8;
BITMAPINFO *binfo;
BITMAPINFO *binfo8;
//영상 메모리
int Action;
LONG width;
LONG height;
LONG width4;
LONG width5;
LPCTSTR lpszClass = TEXT("VFW 기본 예제");

char lpstrFile[MAX_PATH]; //충반한 길이의 버퍼제공하기위해 입력받는 파일명을 MAX_PATH(260)크기만큼선언


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
        300300, 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)
{
  FILE * file ;
  FILE * fp;
  int i;
  int j=0;
  int coutn;
  LONG abc,def;
  switch(iMessage)
  {
  case WM_CREATE:
    file=fopen("test.bmp","rb");
    fp=fopen("new.bmp","wb");
    bmfh=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
    fread(bmfh,sizeof(BITMAPFILEHEADER),1,file);
    binfo=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    fread(binfo,sizeof(BITMAPINFOHEADER),1,file);
    imageData=(BYTE *)malloc(binfo->bmiHeader.biSizeImage);
    fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);
    
    Dataimage=(BYTE *)malloc(binfo->bmiHeader.biSizeImage); //복사받을
    
      width4=binfo->bmiHeader.biWidth*3;
      width4=WIDTH4(width4);
      abc=binfo->bmiHeader.biHeight; //높이를 대입 
      
      for(height=0;height<binfo->bmiHeader.biHeight;height++)
      {
      def=binfo->bmiHeader.biWidth;
      for(width=0;width<binfo->bmiHeader.biWidth;width++)
      {      
      Dataimage[(height*width4)+width*3]=
      imageData[(abc*width4)+def*3];
      Dataimage[(height*width4)+width*3+1]=
      imageData[(abc*width4)+def*3+1];
      Dataimage[(height*width4)+width*3+2]=
      imageData[(abc*width4)+def*3+2];
      def--;
      }
      abc--;
    }
    
    width5=binfo->bmiHeader.biWidth;
    width5=WIDTH4(width5);
    
    binfo8=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    binfo8->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    binfo8->bmiHeader.biWidth=width5;
    binfo8->bmiHeader.biHeight=binfo->bmiHeader.biHeight;
    binfo8->bmiHeader.biXPelsPerMeter=0;
    binfo8->bmiHeader.biYPelsPerMeter=0;
    binfo8->bmiHeader.biSizeImage=(binfo8->bmiHeader.biHeight)*(binfo8->bmiHeader.biWidth);
    binfo8->bmiHeader.biBitCount=8;
    binfo8->bmiHeader.biPlanes=1;
    binfo8->bmiHeader.biClrUsed=256;
    binfo8->bmiHeader.biCompression=0;
    binfo8->bmiHeader.biClrImportant=0;
    for(i=0;i<256;++i)
    {
      binfo8->bmiColors[i].rgbBlue=binfo8->bmiColors[i].rgbGreen=binfo8->bmiColors[i].rgbRed=i;
      binfo8->bmiColors[i].rgbReserved=0;
    }
    bmfh8=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
    bmfh8->bfType=0x4D42;
    bmfh8->bfSize=(binfo8->bmiHeader.biSizeImage)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD);
    bmfh8->bfReserved1=0;
    bmfh8->bfReserved2=0;
    bmfh8->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
  


    
    byteimage=(BYTE *)malloc(binfo8->bmiHeader.biSizeImage);
    
/*
    for(height=0;height<binfo->bmiHeader.biHeight;height++)
    {
      
      for(width=0;width<binfo->bmiHeader.biWidth;width++)
      {      
        byteimage[(height/3*width5)+width]=(imageData[(height*width4)+width+1]+
        imageData[(height*width4)+width+1]+imageData[(height*width4)+width+2])/3;
        
        
      }
      
    
    }  
    */

    
        
    for(i=0,j=0;i<binfo8->bmiHeader.biSizeImage;++i,j=j+3)
    {
      byteimage[i]=(imageData[j]+imageData[j+1]+imageData[j+2])/3;

    }
    fwrite(bmfh8,sizeof(BITMAPFILEHEADER),1,fp);
    fwrite(binfo8,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,1,fp);
    fwrite(byteimage,sizeof(BYTE),binfo8->bmiHeader.biSizeImage,fp);
    

  fclose(fp);  
  fclose(file);  

  return 0;
  case WM_COMMAND: 
        return 0;
    case WM_LBUTTONDOWN:
    Hdc =GetDC(hWnd);
    width=binfo->bmiHeader.biWidth;
    height=binfo->bmiHeader.biHeight;
    MoveWindow(hWnd,200,200,(int)width*2+10,(int)height+33,TRUE);
    SetDIBitsToDevice(Hdc,0,0,width,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
    SetDIBitsToDevice(Hdc,width+5,0,width*2+20,height,NULL,NULL,NULL,height,byteimage,binfo8,DIB_RGB_COLORS);
    
    ReleaseDC(hWnd,Hdc);
    return 0;
    case WM_DESTROY:
    free(imageData);
    free(Dataimage);
    free(binfo);
    free(binfo8);
    free(bmfh);
    free(byteimage);
        PostQuitMessage(0);
        return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}

=============================================================
=============================================================
축소ㅠㅠ

#include<Windows.h>
#include"vfw.h"
#include <math.h>
#include <iostream>


#pragma comment(lib, "vfw32.lib"//vfw32 라이브러리 포함

#define WIDTH4(width) ((width+3)>>2)<<2 //가장중요(폭을 4배수로 맞추는것이다.
#define ID_BCAPTURE 101

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;    //비트맵 정보를 가짐
HDC Hdc;
//비트맵의 정보 
BYTE *imageData,*Dataimage,*byteimage;
BITMAPFILEHEADER *bmfh;
BITMAPFILEHEADER *bmfh8;
BITMAPINFO *binfo;
BITMAPINFO *binfo8;
//영상 메모리
int Action;
LONG width;
LONG height;
LONG width4;
LONG width5;
LPCTSTR lpszClass = TEXT("VFW 기본 예제");

char lpstrFile[MAX_PATH]; //충반한 길이의 버퍼제공하기위해 입력받는 파일명을 MAX_PATH(260)크기만큼선언


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
        300300, 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)
{
  FILE * file ;
  int check=4;
  int i;
  int j=0;
  int coutn;
  int R,G,B;
  
  LONG abc,def;
  switch(iMessage)
  {
  case WM_CREATE:
    file=fopen("test.bmp","rb");
  
    bmfh=(BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER));
    fread(bmfh,sizeof(BITMAPFILEHEADER),1,file);
    binfo=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    fread(binfo,sizeof(BITMAPINFOHEADER),1,file);
    imageData=(BYTE *)malloc(binfo->bmiHeader.biSizeImage);
    fread(imageData,sizeof(BYTE),binfo->bmiHeader.biSizeImage,file);
    
    
    binfo8=(BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256);
    
    
    width4=binfo->bmiHeader.biWidth*3;
    width4=WIDTH4(width4);
  

    binfo8->bmiHeader.biBitCount=24;
    binfo8->bmiHeader.biClrImportant=0;
    binfo8->bmiHeader.biClrUsed=0;
    binfo8->bmiHeader.biCompression=0;
    binfo8->bmiHeader.biHeight=binfo->bmiHeader.biHeight/(check/2);
  

    binfo8->bmiHeader.biWidth=binfo->bmiHeader.biWidth/(check/2);
  //  binfo8->bmiHeader.biWidth=width4/(check/2);
    binfo8->bmiHeader.biPlanes=1;
    binfo8->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
    binfo8->bmiHeader.biSizeImage=binfo8->bmiHeader.biHeight*binfo8->bmiHeader.biWidth;
    binfo8->bmiHeader.biXPelsPerMeter=0;
    binfo8->bmiHeader.biYPelsPerMeter=0;

    
    width5=binfo8->bmiHeader.biWidth*3;
    width5=WIDTH4(width5);

    Dataimage=(BYTE *)malloc(binfo->bmiHeader.biSizeImage); //복사받을
    
    
    for(width=0;width<binfo8->bmiHeader.biWidth;width++)
    {
      for(height=0;height<binfo8->bmiHeader.biHeight;height++)
      {
        
        R=0;
        G=0;
        B=0;
        for(i=0;i<(check/2);i++)
        {
          
          for(j=0;j<(check/2);j++)
          {
            
            
            R+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3];
            G+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3+1];
            B+=imageData[((height*(check/2)+i)*width4)+(width*(check/2)+j)*3+2];
            
            
          }
        }
        
        R=R/check;
        G=G/check;
        B=B/check;
        
        
        Dataimage[(height*width5)+width*3]=R;
        Dataimage[(height*width5)+width*3+1]=G;
        Dataimage[(height*width5)+width*3+2]=B;
        
        
      }
    }
    
    
    /*    fwrite(bmfh8,sizeof(BITMAPFILEHEADER),1,fp);
    fwrite(binfo8,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,1,fp);
    fwrite(byteimage,sizeof(BYTE),binfo8->bmiHeader.biSizeImage,fp);
    
    */

    //  fclose(fp);  
    fclose(file);  
    
    return 0;
  case WM_COMMAND: 
        return 0;
    case WM_LBUTTONDOWN:
    Hdc =GetDC(hWnd);
    width=binfo->bmiHeader.biWidth;
    height=binfo->bmiHeader.biHeight;
    MoveWindow(hWnd,200,200,(int)width*2+10,(int)height+33,TRUE);
    SetDIBitsToDevice(Hdc,0,0,width,height,NULL,NULL,NULL,height,imageData,binfo,DIB_RGB_COLORS);
    SetDIBitsToDevice(Hdc,width+5,0,width*2+20,height,NULL,NULL,NULL,height,Dataimage,binfo8,DIB_RGB_COLORS);
    
    ReleaseDC(hWnd,Hdc);
    return 0;
    case WM_DESTROY:
    free(imageData);
    free(Dataimage);
    free(binfo);
    free(binfo8);
    free(bmfh);
    //  free(byteimage);
        PostQuitMessage(0);
        return 0;
}
return (DefWindowProc(hWnd,iMessage,wParam,lParam));
}