///////////////////////////////////////////////////////////////////////////// // Name: crvcamera.cpp // Purpose: // Author: Cesar Mauri Loba (cesar at crea-si dot com) // Modified by: // Created: 30/05/2008 // Copyright: (C) 2008-10 Cesar Mauri Loba - CREA Software Systems // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// #include "crvcamera.h" #include "crvimage.h" #include #include #include #include // Return timestamp in ms static long long GetTime (void) { struct timeb now; ftime(&now); return now.time*1000 + now.millitm; } CCamera::CCamera() throw (camera_exception) { m_RealWidth=0; m_RealHeight= 0; m_RealFrameRate= 0.0f; m_LastRealFrameRate= 0.0f; m_lastTimeStamp= GetTime(); m_horizontalFlip= false; } CCamera::~CCamera(void) { // Should call Close but is not done here // because DoClose is virtual. We rely on // derived classes } bool CCamera::Open() { bool retval= DoOpen(); if (retval) m_lastTimeStamp= GetTime(); return retval; } void CCamera::Close() { DoClose(); } bool CCamera::QueryFrame (CIplImage& image) { if (!DoQueryFrame(image)) return false; assert(image.Initialized()); PostQueryFrame(image.ptr()); return true; } IplImage* CCamera::QueryFrame() { IplImage* pImage= DoQueryFrame(); if (!pImage) return NULL; PostQueryFrame(pImage); return pImage; } void CCamera::PostQueryFrame(IplImage* pImage) { // Update real size m_RealWidth= pImage->width; m_RealHeight= pImage->height; // Update real FPS long long now= GetTime(); long long elapsedTime= now - m_lastTimeStamp; m_lastTimeStamp= now; m_LastRealFrameRate= m_RealFrameRate; float weight= ((float) elapsedTime / 1000.0f) * 1.5f; if (weight> 1.0f) weight= 1.0f; if (elapsedTime> 0) m_RealFrameRate= (1000.0f / (float) elapsedTime) * weight + m_LastRealFrameRate * (1.0f - weight); else m_RealFrameRate= 0; // Flip image when needed to provide an image with top-left origin if ( pImage->origin == 1 ) { if (m_horizontalFlip) cvFlip (pImage, NULL, -1); else cvFlip (pImage, NULL, 0); pImage->origin= 0; } else if (m_horizontalFlip) cvFlip (pImage, NULL, 1); }