#include #include "log/NLog.h" #include "InputSystem.h" #include "IInputSystem.h" #include "media/WebCamera.h" #include #include #include "WindowWin.h" #include "WindowPixelManager.h" using namespace LifeCore; static WindowWin* wnd; static WindowPixelManager* mgr; static void OnImageCaptured(WebCamera* source, RawBuffer* image) { LogInfo() << "Image captured!"; } uint8 BgrToLum(uint8* bgr) { //0.21 R + 0.71 G + 0.07 B. float b = (float(bgr[0]) / 255.0f) * 0.07f; float g = (float(bgr[1]) / 255.0f) * 0.71f; float r = (float(bgr[2]) / 255.0f) * 0.21f; return uint8((b + g + r) * 255.0f); } void SetChannel(RawBuffer* image, int id, uint8 val) { for(int i = 0; i < image->Type.MF_MT_FRAME_SIZE; ++i) { int offset = i * 3; image->data[offset + id] = val; } } int main() { HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); wnd = new WindowWin(); wnd->SetSize(1024, 768); wnd->CenterWindow(); mgr = new WindowPixelManager(wnd, 24); auto cameras = WebCamera::GetConnectedDevices(); for(auto cam : cameras) { std::wcout << cam->GetName() << std::endl; } WebCamera* cam = new WebCamera(cameras[0]); cam->Event_ImageCapture.Connect(OnImageCaptured); while(true) { LogInfo() << "Opening"; cam->Open(); auto format = cam->GetImage()->Type; int imgSize = format.MF_MT_FRAME_SIZE * 3; RawBuffer* lastImage = new RawBuffer(imgSize, format); RawBuffer* diffImage = new RawBuffer(imgSize, format); int frameId = -1; while(frameId < 14000) { //cam->Update(); if(cam->FrameNumber != frameId) { HWND handle = (HWND)wnd->GetWindowHandle(); auto image = cam->GetImage(); //make diff for(int i = 0; i < imgSize; i+=3) { uint8 lum = BgrToLum(image->data + i); diffImage->data[i + 0] = lum; diffImage->data[i + 1] = lum; diffImage->data[i + 2] = lum; } mgr->SetPixels(diffImage->Type.width, diffImage->Type.height, diffImage->data); frameId = cam->FrameNumber; LogInfo() << "Frame id " << frameId; } wnd->Update(); Sleep(1); } cam->Close(); Sleep(500); LogInfo() << "Iteration"; } std::cin.get(); return 0; }