Files
handleaiuinew/HanddleAI/HandleAiUi-new/back/cameraManager.h
T

165 lines
3.6 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>
//硬触发要求在触发相机前给出触发信号
class backEndManager;
class camera : public QThread
{
Q_OBJECT
public:
QTime lastUpdateTime;
QString cameraName;
camera(cameraModule cameraModulePtrIn, backEndManager* backEndManagerIn, 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);
}
//相机操作
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));
}
signals:
void S1(showImgPack*);
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 QThread
{
Q_OBJECT
public:
bool initFlag = true;
void initialization(backEndManager*);
~cameraManager();
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 run()//测试用的,一般不开
{
//while (1)
//{
// //QThread::msleep(300);
// //for (auto camera : cameras)
// //{
// // camera.second->trigger();
// //}
// QThread::msleep(500);
// cameras.find("181964")->second->trigger();
//}
}
void stop()
{
for (auto camera : cameras)
camera.second->stop();
this->terminate();
}
private:
bool loadModule(QString keyName, QString moduleName, QByteArray initByte);
backEndManager* _backEndManager;
std::vector<cameraModule>camerasVec;//用于初始化和销毁
std::vector<cv::Mat> vec_mat;//没啥用,一直保持为空就好
QList<QLibrary*> lib_list;
public slots:
void R1(showImgPack*);
void cameraTrigger(std::string Name)
{
auto camera=cameras.find(Name);
if (camera != cameras.end())
{
camera->second->trigger();
}
}
};
#endif