150 lines
3.3 KiB
C++
150 lines
3.3 KiB
C++
#ifndef CAMERAManager_H
|
|
#define CAMERAManager_H
|
|
#include <QString>
|
|
#include <backStruct.h>
|
|
#include <unordered_map>
|
|
#include <qlibrary.h>
|
|
#include <opencv.hpp>
|
|
#include <unordered_map>
|
|
#include <qqueue.h>
|
|
#include <qthread.h>
|
|
#include <qdebug.h>
|
|
#include <globalStruct.h>
|
|
#include <qdatetime.h>
|
|
#include <back/threadPoolManager.h>
|
|
#include <serviceModule.hpp>
|
|
#include <future>
|
|
//硬触发要求在触发相机前给出触发信号
|
|
class backEndManager;
|
|
class camera : public QThread
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
QTime lastUpdateTime;
|
|
QString cameraName;
|
|
camera(cameraModule cameraModulePtrIn, int indexIn);
|
|
~camera()
|
|
{
|
|
runFlag = false;
|
|
this->terminate();
|
|
while (this->isRunning() == true);
|
|
}
|
|
void run();
|
|
void stop()
|
|
{
|
|
runFlag = false;
|
|
while (this->isRunning() == true);
|
|
}
|
|
void getImgQueueSize();
|
|
void captureImage(std::shared_ptr <detData> dataIn)
|
|
{
|
|
requestQueue.enqueue(dataIn);
|
|
std::thread([this]() {trigger();}).detach();
|
|
|
|
}
|
|
|
|
//相机操作
|
|
bool trigger()
|
|
{
|
|
if (!cameraModulePtr.module_ptr->run())
|
|
{
|
|
qCritical() << "[Error] " << " m_name:" << cameraName << " run failed!";
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
double getCameraValue()//点激光相机专用
|
|
{
|
|
double value = 0;
|
|
std::vector<cv::Mat> camera_mat;
|
|
QByteArray task_name;
|
|
|
|
int cnt = 0;
|
|
while (!cameraModulePtr.module_ptr->sendData(camera_mat, task_name))
|
|
{
|
|
QThread::msleep(10);
|
|
cnt++;
|
|
if (cnt > 500)
|
|
return 0;
|
|
}
|
|
value = task_name.toDouble();
|
|
return value;
|
|
}
|
|
void getCameraImg(std::vector<cv::Mat>& mats)
|
|
{
|
|
QByteArray task_name;
|
|
if (cameraModulePtr.module_ptr->sendData(mats, task_name))
|
|
qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:" << mats.size();
|
|
}
|
|
void setDigitalShift(float value)
|
|
{
|
|
sendData("DigitalShift_" + std::to_string(value));
|
|
}
|
|
void setExposureTime(float value)
|
|
{
|
|
sendData("exposure_" + std::to_string(value));
|
|
}
|
|
void setUserSet(int value)
|
|
{
|
|
sendData("userset_" + std::to_string(value));
|
|
}
|
|
private:
|
|
//detData* data = nullptr;
|
|
void sendData(std::string str)
|
|
{
|
|
QByteArray task_name(QByteArray::fromStdString(str));
|
|
std::vector<cv::Mat> camera_mat;
|
|
if (!cameraModulePtr.module_ptr->sendData(camera_mat, task_name))
|
|
qCritical() << "[Error] " << "set exposure error!";
|
|
}
|
|
|
|
int index = 0;
|
|
int timeout = 5000;
|
|
QMutex mutex;
|
|
cameraModule cameraModulePtr;
|
|
QQueue<cv::Mat>imgQueue;
|
|
QQueue<std::shared_ptr <detData>>requestQueue;
|
|
backEndManager* _backEndManager;
|
|
bool runFlag = true;
|
|
int imgLost = 0;//未取用从而丢失的图片数量
|
|
int showLost = 0;//因为窗口刷新速率低而未显示的数量
|
|
};
|
|
class cameraManager : public serviceModule
|
|
{
|
|
Q_OBJECT
|
|
public:
|
|
bool initFlag = false;
|
|
void initialization();
|
|
~cameraManager();
|
|
void run();
|
|
std::unordered_map<std::string, camera*>cameras;//key 相机名
|
|
camera* getCamera(std::string cameraName)
|
|
{
|
|
auto camera = cameras.find(cameraName);
|
|
if (camera != cameras.end())
|
|
return camera->second;
|
|
return nullptr;
|
|
}
|
|
void stop()
|
|
{
|
|
for (auto camera : cameras)
|
|
camera.second->stop();
|
|
}
|
|
private:
|
|
bool loadModule(QString keyName, QString moduleName,QString triggerMode, QByteArray initByte);
|
|
std::vector<cameraModule>camerasVec;//用于初始化和销毁
|
|
std::vector<cv::Mat> vec_mat;//没啥用,一直保持为空就好
|
|
QList<QLibrary*> lib_list;
|
|
public slots:
|
|
void cameraTrigger(std::string Name)
|
|
{
|
|
auto camera=cameras.find(Name);
|
|
if (camera != cameras.end())
|
|
{
|
|
camera->second->trigger();
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
#endif |