You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
smokeboxidentification/src/CameraControl.cpp

224 lines
5.1 KiB
C++

#pragma execution_character_set("utf-8")
#include "CameraControl.h"
#include <QDebug>
CameraControl::CameraControl(QObject *parent) : QObject(parent)
{
qRegisterMetaType<QVector<ImageInfo> >("QVector<ImageInfo>");
}
CameraControl::~CameraControl()
{
for each (Camera* pCamera in m_vecPCamera)
{
DELETE_POINTER(pCamera);
}
m_vecPCamera.clear();
}
bool CameraControl::loadCamera(const QList<CameraInfo>& cameraInfoList)
{
bool flag = true;
m_vecPCamera.clear();
m_mapSNIndex.clear();
for each(CameraInfo cameraInfo in cameraInfoList)
{
QString serialNumber = cameraInfo.serialNumber;
CameraType cameraType = cameraInfo.cameraType;
if (cameraType == CameraType::Hik)
{
Camera* pHikCamera = new HikCamera();
if (pHikCamera->initCamera(serialNumber))
{
m_vecPCamera.push_back(pHikCamera);
m_mapSNIndex[serialNumber] = m_vecPCamera.size() - 1;
}
else
{
qWarning() << "SerialNumber: " << serialNumber << " init failed";
flag = true;
}
}
}
return flag;
}
bool CameraControl::openCamera(const QStringList& serialNumberList)
{
bool flag = true;
for each (QString serialNumber in serialNumberList)
{
if (!openCamera(serialNumber))
{
qWarning() << "Open " << serialNumber << "failed!";
flag = false;
}
else
{
qDebug() << "Open " << serialNumber << " successed";
}
}
return flag;
}
bool CameraControl::closeCamera(const QStringList& serialNumberList)
{
bool flag = true;
for each (QString serialNumber in serialNumberList)
{
if (!closeCamera(serialNumber))
{
qWarning() << "Close " << serialNumber << "failed!";
flag = false;
}
else
{
qDebug() << "Close " << serialNumber << " successed";
}
}
return flag;
}
bool CameraControl::startCamera(const QStringList& serialNumberList)
{
bool flag = true;
for each (QString serialNumber in serialNumberList)
{
if (!startCamera(serialNumber))
{
qWarning() << "Start " << serialNumber << "failed!";
flag = false;
}
else
{
qDebug() << "Start " << serialNumber << " successed";
}
}
return flag;
}
bool CameraControl::stopCamera(const QStringList& serialNumberList)
{
bool flag = true;
for each (QString serialNumber in serialNumberList)
{
if (!stopCamera(serialNumber))
{
qWarning() << "Stop " << serialNumber << "failed!";
flag = false;
}
else
{
qDebug() << "Stop " << serialNumber << " successed";
}
}
return flag;
}
bool CameraControl::setSoftwareTrigger(const QStringList& serialNumberList)
{
bool flag = true;
for each (QString serialNumber in serialNumberList)
{
if (!setSoftwareTrigger(serialNumber))
{
qWarning() << "Set " << serialNumber << " software trigger failed!";
flag = false;
}
else
{
qDebug() << "Set " << serialNumber << " software trigger successed";
}
}
return flag;
}
Q_SLOT void CameraControl::onCapture(const QStringList& serialNumberList)
{
int len = serialNumberList.length();
qDebug() << "start capture, length: " << len;
QVector<ImageInfo> vecImageInfo(len);
for (int i = 0; i < len; ++i)
{
QString serialNumber = serialNumberList.at(i);
vecImageInfo[i].image = capture(serialNumber);
vecImageInfo[i].cameraSn = serialNumber;
}
emit sgCapturedImage(vecImageInfo);
}
bool CameraControl::openCamera(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return false;
}
int index = iter.value();
return m_vecPCamera[index]->openCamera();
}
bool CameraControl::closeCamera(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return false;
}
int index = iter.value();
return m_vecPCamera[index]->closeCamera();
}
bool CameraControl::startCamera(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return false;
}
int index = iter.value();
return m_vecPCamera[index]->startCamera();
}
bool CameraControl::stopCamera(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return false;
}
int index = iter.value();
return m_vecPCamera[index]->stopCamera();
}
bool CameraControl::setSoftwareTrigger(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return false;
}
int index = iter.value();
return m_vecPCamera[index]->setTriggerSource(SOFTWARE);
}
cv::Mat CameraControl::capture(const QString& serialNumber)
{
QMap<QString, int>::iterator iter = m_mapSNIndex.find(serialNumber);
if (iter == m_mapSNIndex.end())
{
qWarning() << "Do not find " << serialNumber;
return cv::Mat();
}
int index = iter.value();
cv::Mat imgMat;
m_vecPCamera[index]->takeAPic(imgMat);
if (imgMat.empty())
{
qWarning() << serialNumber << " capture empty";
}
return imgMat;
}