본문 바로가기
코스웨어/14년 스마트컨트롤러

20141007 영상처리 허수웅

by 알 수 없는 사용자 2014. 10. 8.
728x90
반응형
#include <windows.h>
#include
 "vfw.h"

#pragma
 comment(lib, "vfw32.lib")

#define BITMAP_MAXSIZE   ((3*1024*768)+100)    // 비트맵 크기 설정

LRESULT CALLBACK  WndProc(HWND,UINT,WPARAM,LPARAM);
LRESULT CALLBACK  FramInfo(HWND, LPVIDEOHDR);
HINSTANCE    g_hInst;
LPCTSTR      lpszClass
=TEXT("WiseCat");

HWND      HWndMain;
HWND      vfw;
BITMAPINFO    Bm;

static BITMAPFILEHEADER * stpBFH;
static BITMAPINFOHEADER * stpBIH;
static unsigned int uiPad;
static HANDLE hFile;
static unsigned int uiX;
unsigned char *ucPixel;
PAINTSTRUCT ps;
unsigned 
char *ucBitBuffer;
DWORD dwReadSize;  

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{
  HWND hWnd;
  MSG Message;
  WNDCLASS WndClass;
  g_hInst 
= hInstance;

  WndClass.cbClsExtra=0;
  WndClass.cbWndExtra=0;
  WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
  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,CW_USEDEFAULT,CW_USEDEFAULT,
  CW_USEDEFAULT,CW_USEDEFAULT,NULL,(HMENU)NULL,hInstance,NULL);        
  ShowWindow(hWnd,nCmdShow);

  
while(GetMessage(&Message,NULL,0,0))
  {
    TranslateMessage(
&Message);
    DispatchMessage(&Message);
  }

  
return (int)Message.wParam;
}

HDC hdc;

LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
  PAINTSTRUCT ps;

  
switch(iMessage)
  {
    
case WM_CREATE:
      HWndMain = hWnd;

      // ---------------------- 메모리에 비트맵 적재 시작 -------------------- //
      ucBitBuffer=(unsigned char *)malloc(BITMAP_MAXSIZE);               
                        
      
if(0 == ucBitBuffer)
      {
        MessageBox(hWnd,TEXT(
"메모리가 부족합니다"),TEXT("sorry"),MB_OK);   
        DestroyWindow(hWnd);   
      }
      hFile
=CreateFile(TEXT("image.bmp"),GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);   //파일을 생성하거나 연다(open함수)      
         
      
if(hFile == INVALID_HANDLE_VALUE)
      {
        MessageBox(hWnd,TEXT(
"비트맵 파일이 없어서 종료합니다"),TEXT("sorry"),MB_OK);   
        DestroyWindow(hWnd);   
      }
      ReadFile(hFile,ucBitBuffer,BITMAP_MAXSIZE,
&dwReadSize,NULL);
      CloseHandle(hFile);

      stpBFH 
= (BITMAPFILEHEADER *)ucBitBuffer;
      stpBIH = (BITMAPINFOHEADER *)(ucBitBuffer+sizeof(BITMAPFILEHEADER));   
      
      uiX 
= stpBIH->biWidth;
      uiPad = uiX%4;
      // ---------------------- 메모리에 비트맵 적재 끝 -------------------- //
      // ---------------------- 영상처리(캠) 데이터 ------------------------ //
      vfw = capCreateCaptureWindow(TEXT("CAM"), WS_CHILD | WS_VISIBLE, 00400300, hWnd, NULL);
    
      capDriverConnect(vfw,
0);
      capGetVideoFormat(vfw,&Bm,sizeof(Bm));
      Bm.bmiHeader.biWidth  = 320;
      Bm.bmiHeader.biHeight = 240;
      capSetVideoFormat(vfw,&Bm,sizeof(Bm));      
      capSetCallbackOnFrame(vfw, FramInfo);
      capPreviewRate(vfw, 
1);
      capPreview(vfw, FALSE);
      
// ---------------------- 영상처리(캠) 데이터 ------------------------ //

      return 0;

    case WM_PAINT:
      hdc = BeginPaint(hWnd,&ps);
      EndPaint(hWnd,&ps);
      return 0;

    case WM_DESTROY:  
      free(ucBitBuffer);
      PostQuitMessage(
0);
      return 0;
  }
  
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}

LRESULT CALLBACK FramInfo(HWND hWnd, LPVIDEOHDR lpData)
{  
  
static int iCntX;
  static int iCntY;
  static int Jump;
  
  hdc 
= GetDC(HWndMain);
  
  
     ucPixel 
=ucBitBuffer + stpBFH->bfOffBits;   //그림 위치를 가리킨다.
  
  
// ---------------------- 원본 영상 출력 ------------------------------------- //
  StretchDIBits(hdc, 00, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, 00,
  Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, lpData->lpData, &Bm, DIB_RGB_COLORS, SRCCOPY);
  // ---------------------- 원본 영상 출력 ------------------------------------- //

  
  
// ---------------------- 원본 수정 작업(비트맵 이미지를 색을 정하여 배경으로 수정) ---------- //
  Jump= 0;
  for(iCntY = 0; iCntY < Bm.bmiHeader.biHeight ; ++iCntY)  
  {        
    
for(iCntX = 0; iCntX  < Bm.bmiHeader.biWidth  ; ++iCntX, Jump += 3, ucPixel += 3 )
    {
      
if(lpData->lpData[Jump + 2> 100)
      {
        
continue;
      }
      
if(lpData->lpData[Jump + 1> 100)
      {
        
continue;
      }
      
if(lpData->lpData[Jump + 0> 50)
      {
        lpData-
>lpData[Jump]    = *(ucPixel+0);  // Blue
        lpData->lpData[Jump + 2]  = *(ucPixel+2);  // Red
        lpData->lpData[Jump + 1]  = *(ucPixel+1);  // Green
      }
    }       
    ucPixel 
= ucPixel + uiPad;
  }
  
// ---------------------- 원본 수정 작업(비트맵 이미지를 색을 정하여 배경으로 수정) ---------- //


  // --------------------------- 수정된 사본 출력 ------------------------------------ //
  StretchDIBits(hdc, Bm.bmiHeader.biWidth +200, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, 
  00, Bm.bmiHeader.biWidth, Bm.bmiHeader.biHeight, lpData->lpData, &Bm, DIB_RGB_COLORS, SRCCOPY);
  // --------------------------- 수정된 사본 출력 ------------------------------------ //
  
  ReleaseDC(HWndMain, hdc);

  
return 0;
}

 

728x90

'코스웨어 > 14년 스마트컨트롤러' 카테고리의 다른 글

20141007-김해성  (0) 2014.10.08
20141008서상우  (0) 2014.10.08
20141008 영상처리 문대영  (0) 2014.10.08
20141007 영상처리 이재우  (0) 2014.10.08
2014.10.07. 업무일지 [출석번호 22 허수웅]  (5) 2014.10.08
20141007 영상처리 - 손병규  (0) 2014.10.07
영상처리 - 이경진  (0) 2014.10.07
2014 10 07 영상처리 보고  (0) 2014.10.07