/////////////////////////////////////////////////////////////////////////////
// Copyright: (C) 2009-19 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_wdm.h"
#include
#include
#include
#include
#include "crvimage.h"
#include "videoInput.h"
#include "simplelog.h"
CCameraWDM::CCameraWDM(int cameraId, unsigned int width, unsigned int height, float fr)
{
if (cameraId>= GetNumDevices()) throw camera_exception("wrong camera id");
m_Id= cameraId;
m_Width= width;
m_Height= height;
m_FrameRate= fr;
m_VI= NULL;
if (slog_get_priority()> SLOG_PRIO_CRIT)
videoInput::setVerbose(true);
else
videoInput::setVerbose(false);
}
CCameraWDM::~CCameraWDM(void)
{
Close();
}
bool CCameraWDM::DoOpen ()
{
// Already open? Do nothing
if (m_VI) return true;
// Create a videoInput object
m_VI= new videoInput;
assert (m_VI);
// BGR channel sequence assumed
//m_pImage= new CIplImage (m_Width, m_Height, IPL_DEPTH_8U, "BGR");
//assert (m_pImage);
m_VI->setIdealFramerate(m_Id, (int) m_FrameRate);
if (!m_VI->setupDevice (m_Id, m_Width, m_Height)) {
Close();
return false;
}
return true;
}
void CCameraWDM::DoClose ()
{
if (m_VI) {
m_VI->stopDevice(m_Id);
delete m_VI;
m_VI= NULL;
//delete m_pImage;
}
}
IplImage *CCameraWDM::DoQueryFrame()
{
if (!CCameraWDM::DoQueryFrame(m_Image)) return NULL;
return m_Image.ptr();
}
bool CCameraWDM::DoQueryFrame(CIplImage& image)
{
if (!m_VI) return false;
const int width = m_VI->getWidth(m_Id);
const int height = m_VI->getHeight(m_Id);
const int size = m_VI->getSize(m_Id);
if (!image.Initialized() || width!= image.Width()
|| height!= image.Height() || size> image.ptr()->imageSize) {
// Allocate image in case is not properly set up
if (!image.Create(width, height, IPL_DEPTH_8U, "BGR", 1)) {
assert (!"CCameraWDM::DoQueryFrame: cannot create image");
return false;
}
}
assert (image.Initialized());
assert (image.ptr()->imageSize== m_VI->getSize(m_Id));
// make sure that both images have the same size
if (image.ptr()->imageSize != m_VI->getSize(m_Id)) {
// size mismatch
slog_write(SLOG_PRIO_DEBUG, "%s: %d. image size mismatch", __FILE__, __LINE__);
return false;
}
m_VI->getPixels(m_Id, reinterpret_cast(image.ptr()->imageData), false, false);
// Set appropriate origin
image.ptr()->origin= 1;
return true;
}
void CCameraWDM::ShowSettingsDialog ()
{
if (m_VI) m_VI->showSettingsWindow (m_Id);
}
int CCameraWDM::g_numDevices= -1;
char CCameraWDM::g_deviceNames[MAX_CAM_DEVICES][CAM_DEVICE_NAME_LENGHT];
int CCameraWDM::GetNumDevices()
{
// Win32: uses videoInput
if (g_numDevices== -1) {
// First initialization
g_numDevices= videoInput::listDevices (true);
if (g_numDevices> MAX_CAM_DEVICES) g_numDevices= MAX_CAM_DEVICES;
for (int i= 0; i< g_numDevices; ++i) {
// Prepend device number and append device name
_snprintf (g_deviceNames[i], CAM_DEVICE_NAME_LENGHT, " (Id:%d) %s\0", i, videoInput::getDeviceName(i));
}
}
return g_numDevices;
}
const char* CCameraWDM::GetDeviceName (unsigned int id)
{
if ((int) id>= GetNumDevices()) return NULL;
return g_deviceNames[id];
}