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

20151125 강동조 개인업무일지 API(작성중)

by 알 수 없는 사용자 2015. 11. 25.
728x90
반응형

영상 히스토리 만들기


소스


memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);

  for (iCnty = 0; iCnty < YSCALE; ++iCnty)
  {
    for (iCntx = 0; iCntx < XSCALE; ++iCntx)
    {
      ++iCntRGB[vData[3 * (iCnty*XSCALE + iCntx) + 0]];
      ++iCntRGB[vData[3 * (iCnty*XSCALE + iCntx) + 1]];
      ++iCntRGB[vData[3 * (iCnty*XSCALE + iCntx) + 2]];
      ++iCntR[vData[3 * (iCnty*XSCALE + iCntx) + 2]];
      ++iCntG[vData[3 * (iCnty*XSCALE + iCntx) + 1]];
      ++iCntB[vData[3 * (iCnty*XSCALE + iCntx) + 0]];

    }
  }
  //Y축의 최대값 설정
  iMaxVal = 0;
  for (iCntx = 0; iCntx < XGRP; ++iCntx)
  {
    iCntRGB[iCntx] = iCntRGB[iCntx] / 3;
    if (iCntRGB[iCntx] > iMaxVal)
    {
      iMaxVal = iCntRGB[iCntx];
    }
  }
  for (iCntx = 0; iCntx < XGRP; ++iCntx)
  {
    iCntRGB[iCntx] = (iCntRGB[iCntx] * XGRP) / iMaxVal;    //0 ~ 255사이의값을 갖는다 오차를 줄이기 위해 곱하기를 먼저한다
  }

  MemDC = CreateCompatibleDC(hdc);
  SelectObject(MemDC, HistoR);

  //그래프 그리기
  PatBlt(MemDC, 00, XGRP + 1, YGRP, WHITENESS);  //배경을 흰색으로 바꾼다  
  for (iCnty = 0; iCnty < YGRP; ++iCnty)
  {
    for (iCntx = 0; iCntx < XGRP; ++iCntx)
    {
      //세로축
      if (NULL == iCnty)
      {
        SetPixel(MemDC, iCntx, iCnty, RGB(000));  //RGB의 숫자만 바꿔주면 색깔이 바뀐다
      }
      // y축 높이보다 값이 크면 점을 찍는다.
      if ((YGRP - 1 - iCnty) <= iCntRGB[iCntx])
      {
        SetPixel(MemDC, iCntx, iCnty, RGB(000));
      }
    }
  }
  BitBlt(hdc, 2 * (XSCALE + SPACE), 0, XGRP + 1, YGRP, MemDC, 00, SRCCOPY);



소스는 검은색깔 하나만 적어 놓았습니다



기상캐스퍼를 볼 때 날씨를 가르키며 소개를합니다 그것과 같은 기술로 구현해 보았습니다


for (iCntY = 0; iCntY < YSCALE; ++iCntY)
  {
    for (iCntX = 0; iCntX < XSCALE; ++iCntX)
    {
      //iCal = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX)];
      vData[3 * (XSCALE * iCntY + iCntX) + 2= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 2];
      vData[3 * (XSCALE * iCntY + iCntX) + 1= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 1];
      vData[3 * (XSCALE * iCntY + iCntX) + 0= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 0];
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 0])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 0])
      {
        continue;
      }
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 1])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 1])
      {
        continue;
      }
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 2])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 2])
      {
        continue;
      }
      vData[3 * (XSCALE * iCntY + iCntX) + 2]=0;
      vData[3 * (XSCALE * iCntY + iCntX) + 1]=0;
      vData[3 * (XSCALE * iCntY + iCntX) + 0]=255;
    }
  }




소스

#include <windows.h>
#include <Vfw.h>


#define XSCALE  320
#define YSCALE  240
#define SPACE  20
#define XGRP  256
#define YGRP  256

// alpha 값
#define MALPHA  170
#define GALPHA  20
////실제로 사용하는 알파값들
#define HALPHA  (MALPHA+GALPHA)
#define LALPHA  (MALPHA-GALPHA)
#define GAB    XSCALE*YSCALE * 3


typedef struct _msgmap
{
  UINT uiMsg;
  LRESULT(*fp)(HWND, WPARAM, LPARAM);
} stMsgMap;

LRESULT On_Paint(WPARAM, LPARAM);
LRESULT On_Create(WPARAM, LPARAM);
LRESULT On_Destroy(WPARAM, LPARAM);
LRESULT capture(HWND, LPVIDEOHDR);

stMsgMap MsgMap[] =
{
  { WM_PAINT, On_Paint },
  { WM_CREATE, On_Create },
  { WM_DESTROY, On_Destroy },
  { WM_NULL, 0 }
};

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);


static BYTE BData[XSCALE*YSCALE * 3];
BITMAPINFO stBMPInfo;
HINSTANCE g_hInst;
LPSTR lpszClass = TEXT("VFW ALPHA");
HWND hWnd;
HBITMAP Histo;

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
  , LPSTR lpszCmdParam, int nCmdShow)
{
  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)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, 000)) {
    TranslateMessage(&Message);
    DispatchMessage(&Message);
  }
  return Message.wParam;
}

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

  stMsgMap *stpMap = MsgMap;

  while (WM_NULL != ((*stpMap).uiMsg))
  {
    if (iMessage == ((*stpMap).uiMsg))//dest가 들어오면
    {
      return (((*stpMap).fp)(hWnd, wParam, lParam));
    }
    ++stpMap;
  }
  return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

LRESULT On_Create(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  HDC MemDC;
  HWND hCamera;
  BOOL bRet;
  DWORD Dwgo;
  HANDLE hdl;
  BITMAPFILEHEADER stBFHead;
  BITMAPINFOHEADER stBFInfo;

  //절차가있다.윈도우 생성
  hdl = CreateFile(L"weather.bmp", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  if (hdl == NULL)
  {
    MessageBox(hWnd, TEXT("날씨비트맵생성실패"), TEXT("에러"), MB_OK);
  }
  bRet = ReadFile(hdl, BData, GAB, &Dwgo, NULL);
  if (bRet == NULL)
  {
    MessageBox(hWnd, TEXT("날씨읽기실패"), TEXT("에러"), MB_OK);
  }

  hCamera = capCreateCaptureWindow(TEXT("samrt")
    , WS_CHILD | WS_VISIBLE
    , 00, XSCALE, YSCALE
    , hWnd, 0);
  if (NULL == hCamera)  //창을 못만들어서 뜨는 에러
  {
    MessageBox(hWnd, TEXT("창을 열수 없음"), TEXT("에러"), MB_OK);
  }

  bRet = capDriverConnect(hCamera, 0);  //화면을 카메라와 연결한다.(USB장치연결) //0:카메라마다 고유번호
  if (FALSE == bRet)  //카메라가 없거나 드라이버가 안잡힘.
  {
    MessageBox(hWnd, TEXT("카메라가 없음."), TEXT("에러"), MB_OK);
  }

  capPreviewRate(hCamera, 1);        //화면에 보일 속도
  capGetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));  //비디오 형식을 bInfo에 저장

  stBMPInfo.bmiHeader.biWidth = XSCALE;  //가로, 세로 길이 set
  stBMPInfo.bmiHeader.biHeight = YSCALE;

  capSetVideoFormat(hCamera, &stBMPInfo, sizeof(stBMPInfo));//bInfo 출력준비
  capSetCallbackOnFrame(hCamera, capture);//비디오 라이브러리에서 함수호출 
  capPreview(hCamera, TRUE);        // 영상화면 출력//TRUE:Preview flag




  CloseHandle(hdl);
  return 0;
}

LRESULT On_Paint(WPARAM wParam, LPARAM lParam)
{
  HDC hdc;
  PAINTSTRUCT ps;
  hdc = BeginPaint(hWnd, &ps);
  EndPaint(hWnd, &ps);
  return 0;
}
LRESULT On_Destroy(WPARAM wParam, LPARAM lParam)
{
  PostQuitMessage(0);
  return 0;
}

LRESULT capture(HWND hWpWnd, LPVIDEOHDR lpVHdr)//구조체 정보가 실려온다.
{
  HDC hdc;
  static BYTE vData[XSCALE*YSCALE * 3];

  UINT iCntX;
  UINT iCntY;
  UINT iCal;

  hdc = GetDC(hWnd);

  //영상복사 
  //memcpy(vData, lpVHdr->lpData, lpVHdr->dwBufferLength);
  for (iCntY = 0; iCntY < YSCALE; ++iCntY)
  {
    for (iCntX = 0; iCntX < XSCALE; ++iCntX)
    {
      //iCal = lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX)];
      vData[3 * (XSCALE * iCntY + iCntX) + 2= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 2];
      vData[3 * (XSCALE * iCntY + iCntX) + 1= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 1];
      vData[3 * (XSCALE * iCntY + iCntX) + 0= lpVHdr->lpData[3 * (XSCALE * iCntY + iCntX) + 0];
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 0])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 0])
      {
        continue;
      }
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 1])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 1])
      {
        continue;
      }
      if (HALPHA < vData[3 * (XSCALE * iCntY + iCntX) + 2])
      {
        continue;
      }
      if (LALPHA > vData[3 * (XSCALE * iCntY + iCntX) + 2])
      {
        continue;
      }
      vData[3 * (XSCALE * iCntY + iCntX) + 0= BData[3 * (XSCALE * iCntY + iCntX) + 0];
      vData[3 * (XSCALE * iCntY + iCntX) + 1= BData[3 * (XSCALE * iCntY + iCntX) + 1];
      vData[3 * (XSCALE * iCntY + iCntX) + 2= BData[3 * (XSCALE * iCntY + iCntX) + 2];
    }
  }

  StretchDIBits(hdc
    , XSCALE + SPACE, 0
    , XSCALE, YSCALE
    , 00
    , XSCALE, YSCALE
    , vData, &stBMPInfo, DIB_RGB_COLORS, SRCCOPY);

  ReleaseDC(hWnd, hdc);
  return 0;
}


기상캐스터를 위해서 나오는 기술을 구현 하였습니다






728x90