void SingleFace::UninitInstance() { // Clean up the memory allocated for Face Tracking and rendering. m_FTHelper.Stop(); if (m_hAccelTable) { DestroyAcceleratorTable(m_hAccelTable); m_hAccelTable = NULL; } DestroyWindow(m_hWnd); m_hWnd = NULL; if (m_pImageBuffer) { m_pImageBuffer->Release(); m_pImageBuffer = NULL; } if (m_pVideoBuffer) { m_pVideoBuffer->Release(); m_pVideoBuffer = NULL; } }
//-------------------------------------------------------------- void testApp::update() { IFTImage* img = faceTracker.GetColorImage(); if(img) memcpy(colorBuffer, img->GetBuffer(), 640*480*4); color.setFromPixels(colorBuffer, 640,480, OF_IMAGE_COLOR_ALPHA, false); color.update(); //depth.setFromPixels((unsigned char *) faceTracker.depthBuffer, 320,240, OF_IMAGE_COLOR_ALPHA); //depth.update(); }
// Drawing code BOOL SingleFace::ShowEggAvatar(HDC hdc, int width, int height, int originX, int originY) { static int errCount = 0; BOOL ret = FALSE; if (m_pImageBuffer && SUCCEEDED(m_pImageBuffer->Allocate(width, height, FTIMAGEFORMAT_UINT8_B8G8R8A8))) { memset(m_pImageBuffer->GetBuffer(), 0, m_pImageBuffer->GetStride() * height); // clear to black m_eggavatar.SetScaleAndTranslationToWindow(height, width); m_eggavatar.DrawImage(m_pImageBuffer); BITMAPINFO bmi = {sizeof(BITMAPINFO), width, height, 1, static_cast<WORD>(m_pImageBuffer->GetBytesPerPixel() * CHAR_BIT), BI_RGB, m_pImageBuffer->GetStride() * height, 5000, 5000, 0, 0}; errCount += (0 == StretchDIBits(hdc, 0, 0, width, height, 0, 0, width, height, m_pImageBuffer->GetBuffer(), &bmi, DIB_RGB_COLORS, SRCCOPY)); ret = TRUE; } return ret; }
void MultiFace::UninitInstance() { // Clean up the memory allocated for Face Tracking and rendering. m_FTHelper.Stop(); if (m_hAccelTable) { DestroyAcceleratorTable(m_hAccelTable); m_hAccelTable = NULL; } DestroyWindow(m_hWnd); m_hWnd = NULL; if (m_pImageBuffer) { for (UINT i=0; i<m_nbUsers; i++) { if (m_pImageBuffer[i]) { m_pImageBuffer[i]->Release(); m_pImageBuffer[i] = NULL; } } delete[] m_pImageBuffer; } if (m_pVideoBuffer) { m_pVideoBuffer->Release(); m_pVideoBuffer = NULL; } if (m_eggavatar) { delete[] m_eggavatar; } }
// Drawing the video window BOOL MultiFace::ShowVideo(HDC hdc, int width, int height, int originX, int originY) { BOOL ret = TRUE; // Now, copy a fraction of the camera image into the screen. IFTImage* colorImage = m_FTHelper.GetColorImage(); if (colorImage) { int iWidth = colorImage->GetWidth(); int iHeight = colorImage->GetHeight(); if (iWidth > 0 && iHeight > 0) { int iTop = 0; int iBottom = iHeight; int iLeft = 0; int iRight = iWidth; // Keep a separate buffer. if (m_pVideoBuffer && SUCCEEDED(m_pVideoBuffer->Allocate(iWidth, iHeight, FTIMAGEFORMAT_UINT8_B8G8R8A8))) { // Copy do the video buffer while converting bytes colorImage->CopyTo(m_pVideoBuffer, NULL, 0, 0); // Compute the best approximate copy ratio. float w1 = (float)iHeight * (float)width; float w2 = (float)iWidth * (float)height; if (w2 > w1 && height > 0) { // video image too wide float wx = w1/height; iLeft = (int)max(0, m_FTHelper.GetXCenterFace() - wx / 2); iRight = iLeft + (int)wx; if (iRight > iWidth) { iRight = iWidth; iLeft = iRight - (int)wx; } } else if (w1 > w2 && width > 0) { // video image too narrow float hy = w2/width; iTop = (int)max(0, m_FTHelper.GetYCenterFace() - hy / 2); iBottom = iTop + (int)hy; if (iBottom > iHeight) { iBottom = iHeight; iTop = iBottom - (int)hy; } } int const bmpPixSize = m_pVideoBuffer->GetBytesPerPixel(); SetStretchBltMode(hdc, HALFTONE); BITMAPINFO bmi = {sizeof(BITMAPINFO), static_cast<LONG>(iWidth), static_cast<LONG>(iHeight), static_cast<WORD>(1), static_cast<WORD>(bmpPixSize * CHAR_BIT), BI_RGB, m_pVideoBuffer->GetStride() * iHeight, 5000, 5000, 0, 0}; if (0 == StretchDIBits(hdc, originX, originY, width, height, iLeft, iBottom, iRight-iLeft, iTop-iBottom, m_pVideoBuffer->GetBuffer(), &bmi, DIB_RGB_COLORS, SRCCOPY)) { ret = FALSE; } } } } return ret; }