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

2015.11.24_개인업무일지_[Win32API #9]_이량경_히스토그램 그래프,VFW

by 알 수 없는 사용자 2015. 11. 24.
728x90
반응형
<Win32API>✔ 
================================================================
히스토그램 그래프 출력>
✔   PatBlt (HDC hdc
     , int nXLeft, int nYLeft
     , int nWidth, int nHeight
     , DWORD dwRop);

hdc : DC의 핸들
nXLeft, nYLeft : 채색을 시작할 좌상단 좌표. 논리 좌표
nWidth, nHeight : 채색할 사각 영역의 넓이와 높이
dwRop : 채색 방법을 지정하는 플래그
     - 다음 중 하나의 플래그를 지정해 준다.
     - 이 플래그들은 현재 DC에 선택되어 있는 브러시의 색상과 화면에 이미 출력되어 있는 그림의 색상을 어떻게 혼합할 것인가를 지정한다.
플래

설명

PATCOPY

DC에 선택되어 있는 브러시의 색상을 그대로 출력한다.

PATINVERT

브러시의 색상과 화면의 색상을 XOR 연산한다.

DSTINVERT

화면의 색상을 반전시킨다.

BLACKNESS

팔레트의 0번 색상으로 채운다. 보통 검정색이다.

WHITENESS

팔레트의 1번 색상으로 채운다. 보통 흰색이다.

성공하면 0이 아닌 값을 리턴하며 실패할 경우 0을 리턴한다.



       PatBlt(MemDC, 0, 0, XGRAPH + 1, YGRAPH, WHITENESS); // 팔레트의 1번색상으로 채움.
       
        for (iCnty = 0; iCnty < YGRAPH; ++iCnty)
       {
               for (iCntx = 0; iCntx < XGRAPH; ++iCntx)
              {
                     SetPixel(MemDC, 0, iCnty, RGB(0, 0, 0)); // y축 , 세로축
                     
                      //255나오도록 YGRAP-1-iCnty
                      if ( YGRAPH+1-iCnty <= uiCnt[iCntx])
                     {
                           SetPixel(MemDC, iCntx + 1, iCnty, RGB(0, 0, 0));
                     }
              }

       }



<PatBlt  : 검은 배경->흰색>

- 겹침영역을 흰색으로 변경







* 그래프
x : 0~255 = 256개 + 축 = 257
(define +1) -1(좌표값)

* 개인적으로 추가 하면 좋아 :
     - 평활화 된 이미지하나더 출력
     - RGB값 각각의 그래프 출력

* 255나오도록 if (YGRAPH -1-iCnty <= uiCnt[iCntx])

...여러가지 기법이 있다.

<Video For Windows> (마이크로소프트에서 개발한 라이브러리)
1. VFW 라이브러리 추가하기
1) 방법1. 소스로 추가
//#pragma comment(lib, "vfW32.lib")


2) 방법2. 

- 프로젝트 링커 옵션에 추가



https://msdn.microsoft.com/ko-kr/library/windows/desktop/ms632600(v=vs.85).aspx


LRESULT OnCreate( WPARAM wParam LPARAM lParam )
{
        HDC hdc;
        PAINTSTRUCT ps;
        HWND hCamera;
        BITMAPINFO bInfo;
        //절차가있다.윈도우 생성
       hCamera = capCreateCaptureWindow (TEXT ("samrt" )
              , WS_CHILD | WS_VISIBLE
              , 0, 0, 320, 240
              , hWnd, 0);

       
        capDriverConnect ( hCamera, 0);    //화면을 카메라와 연결한다.(USB장치연결) //0:카메라마다 고유번호
        capPreviewRate (hCamera, 1);//화면에 보일 속도
        capGetVideoFormat (hCamera, &bInfo, sizeof (bInfo));      //비디오 형식을 bInfo에 저장
       
       bInfo.bmiHeader.biWidth = 320;     //가로, 세로 길이 set
       bInfo.bmiHeader.biHeight = 240;   
       
        capSetVideoFormat (hCamera, &bInfo, sizeof (bInfo));//bInfo 출력준비
        capPreview (hCamera, TRUE );         // 영상화면 출력//TRUE:Preview flag

       hdc = GetDC(hWnd);
       ReleaseDC(hWnd, hdc);
        return 0;
}


사이즈 변경 카메라 화면

>---------------------------------------------------------

HWND VFWAPI capCreateCaptureWindow(
   LPCTSTR lpszWindowName,
   DWORD   dwStyle,
   int     x,
   int     y,
   int     nWidth,
   int     nHeight,
   HWND    hWnd,
   int     nID
);

Returns a handle of the capture window if successful or NULL otherwise.
=========================================================<

>---------------------------------------------------------

capDriverConnect

BOOL capDriverConnect(
    hwnd,
    iIndex
);
Returns TRUE if successful or FALSE if the specified capture driver cannot be connected to the capture window.
=========================================================<

영상을 뿌리는 것만 되고 영상처리가 안된다.

영상데이터를 받아야한다.

1단계 ) 콜백함수를 등록하는 함수가 이싿.

2) 콜백함수로 
>---------------------------------------------------------
https://msdn.microsoft.com/en-us/library/windows/desktop/dd756930(v=vs.85).aspx
capSetCallbackOnFrame
LRESULT CALLBACK capVideoStreamCallback(
   HWND       hWnd,
   LPVIDEOHDR lpVHdr
);
Returns TRUE if successful or FALSE if streaming capture or a single-frame capture session is in progress.
=========================================================<
>---------------------------------------------------------
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757688(v=vs.85).aspx
LPVIDEOHDR
typedef struct videohdr_tag {
  LPBYTE    lpData;
  DWORD     dwBufferLength;
  DWORD     dwBytesUsed;
  DWORD     dwTimeCaptured;
  DWORD_PTR dwUser;
  DWORD     dwFlags;
  DWORD_PTR dwReserved[4];
} VIDEOHDR, *PVIDEOHDR, *LPVIDEOHDR;
=========================================================<
BOOL StretchBlt ( HDC hdcDest

     , int nXOriginDest, int nYOriginDest

     , int nWidthDest, int nHeightDest

     , HDC hdcSrc

     , int nXOriginSrc, int nYOriginSrc

     , int nWidthSrc, int nHeightSrc, DWORD dwRop);

>---------------------------------------------------------
https://msdn.microsoft.com/en-us/library/windows/desktop/dd145121(v=vs.85).aspx
StretchDIBits
int StretchDIBits(
  _In_       HDC        hdc,
  _In_       int        XDest,
  _In_       int        YDest,
  _In_       int        nDestWidth,
  _In_       int        nDestHeight,
  _In_       int        XSrc,
  _In_       int        YSrc,
  _In_       int        nSrcWidth,
  _In_       int        nSrcHeight,
  _In_ const VOID       *lpBits,
  _In_ const BITMAPINFO *lpBitsInfo,
  _In_       UINT       iUsage,
  _In_       DWORD      dwRop
);
DIB_RGB_COLORS : The color table contains literal RGB values.
=========================================================<
2> Xdest : lpdata가 가지고있음.바로옆에 우리가 띄우는 영상 같은영상 2개



BGR중 하나를 주석처리하면 주석 처리된 색이 보인다



* 데이터 크기에 /가로/세로 = 3 으로 RGB가 나온다.


LRESULT capture( HWND hWpWnd , LPVIDEOHDR lpVHdr )//구조체 정보가 실려온다.
{
        HDC hdc;
       hdc = GetDC(hWnd);
        UINT iCntx;
        UINT iCnty;
        unsigned char cbuf[20];
        LPBYTE lpData;
        static BYTE vData[ XSCALE* YSCALE*3];

       hdc = GetDC(hWnd);
        //************************************
       memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength); //동영상내부는 그림이다.
       
        for (iCntx = 0; iCntx < XSCALE; iCntx++)
       {
               for (iCnty = 0; iCnty < YSCALE; iCnty++)
              {      
                      //*(vData + (iCnty *XSCALE + iCntx) * 3 + 0) = 255;//G
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 1) = 0; //G
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 2) = 0; //G
              }
       }
       StretchDIBits(hdc
              , XSCALE, 0
              , XSCALE, YSCALE
              , 0,0
              , XSCALE, YSCALE
              , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY );
        //************************************B
       memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
        for (iCntx = 0; iCntx < XSCALE; iCntx++)
       {
               for (iCnty = 0; iCnty < YSCALE; iCnty++)
              {      
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 0) = 0; //G
                      //*(vData + (iCnty *XSCALE + iCntx) * 3 + 1) = 0;//G
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 2) = 0; //G
              }
       }
       StretchDIBits(hdc
              ,0
              , YSCALE
              , XSCALE, YSCALE
              , 0, 0
              , XSCALE, YSCALE
              , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY );
        //************************************G
       memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
        for (iCntx = 0; iCntx < XSCALE; iCntx++)
       {
               for (iCnty = 0; iCnty < YSCALE; iCnty++)
              {      
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 0) = 0; //G
                     *(vData + (iCnty * XSCALE + iCntx) * 3 + 1) = 0; //G
                      //*(vData + (iCnty *XSCALE + iCntx) * 3 + 2) = 0;//G
              }
       }
       StretchDIBits(hdc
              , XSCALE       //시작점
              , YSCALE
              , XSCALE, YSCALE
              , 0, 0
              , XSCALE, YSCALE
              , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY );
        //************************************R

        wsprintf(cbuf, TEXT( "%u"), lpVHdr ->dwBufferLength);
        SetWindowText(hWnd, cbuf);

       ReleaseDC( hWpWnd, hdc);
        return 0;

}



>>>코드<<<<


main.c





728x90