#include "camera_thread.h" #include #include #include #include QQueue ImageDataPack; MyThread::~MyThread() { this->setStopRun(); wait(100); exit(); qDebug() << "[INFO] " << " m_name:" << m_name << " delete thread success! "; } //bool MyThread::setModule(QString station_name, QString name, QString type, MyModule module, QJsonObject obj) bool MyThread::setModule(QString station_name, QString name, QString type, MyModule module) { m_name = name; m_triggermodel = type; m_Module = module; // m_moduleobj = obj; m_stationName = station_name; m_staticName = m_name; qCritical() << "[DEBUG] " << " name " << name; //QString image_queue_num = m_moduleobj.value("image_queue_num").toString(); //picNum = image_queue_num.toInt(); if (m_triggermodel.isEmpty()) { qCritical() << "[Error] " << " trigger_mod is null ! "; return false; } return true; } void MyThread::run() { try { qDebug() << "[INFO] " << " m_type:" << m_type << " module start time: " << "now!"; if (!runCameraModule()) { qCritical() << "[Error] " << "runCameraModule run failed! "; return; } } catch (QString ev) { qCritical() << "[Error] " << "catch ev:" << ev; return; } //qDebug() << __FUNCTION__ << " line:" << __LINE__ << " module run end time :" << QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz") ; } void MyThread::setMutex(QMutex* mutex) { m_mutex = mutex; } bool MyThread::cameraTrigger() { if (!m_Module.module_ptr->run()) { qCritical() << "[Error] " << " m_name:" << m_name << " run failed!"; return false; } return true; } void MyThread::getImageFromCamera(std::vector& mats) { std::vector camera_mat; QByteArray task_name; if (!m_Module.module_ptr->sendData(camera_mat, task_name)) qCritical() << "[Error] " << " camera_mat is error! "; qDebug() << __FUNCTION__ << " line:" << __LINE__ << "camera_mat size:"<< camera_mat.size(); for (auto img : camera_mat) mats.push_back(img.clone()); } void MyThread::setExposureTime(float value) { QByteArray task_name("exposure_" + QByteArray::number(value)); std::vector camera_mat; if (!m_Module.module_ptr->sendData(camera_mat, task_name)) qCritical() << "[Error] " << "set exposure error!"; } void MyThread::setUserSet(int value) { QByteArray task_name("userset_" + QByteArray::number(value)); std::vector camera_mat; if (!m_Module.module_ptr->sendData(camera_mat, task_name)) qCritical() << "[Error] " << "set exposure error!"; } void MyThread::setLightSourceValue(int aLine = -1, int bLine = -1, int cLine = -1, int dLine = -1,QString Name="") { //ex:"SA0200#SB0100#SC000#" std::string aLineStr(std::to_string(aLine)), bLineStr(std::to_string(bLine)), cLineStr(std::to_string(cLine)), dLineStr(std::to_string(dLine)), controllCommand(""); // if (aLine != -1) { controllCommand += "SA0"; if (aLineStr.length() < 3) for (int i = 0; i < 3 - aLineStr.length(); i++) controllCommand += "0"; controllCommand += aLineStr + "#"; } // if (bLine != -1) { controllCommand += "SB0"; if (bLineStr.length() < 3) for (int i = 0; i < 3 - bLineStr.length(); i++) controllCommand += "0"; controllCommand += bLineStr + "#"; } // if (cLine != -1) { controllCommand += "SC0"; if (cLineStr.length() < 3) for (int i = 0; i < 3 - cLineStr.length(); i++) controllCommand += "0"; controllCommand += cLineStr + "#"; } // if (dLine != -1) { controllCommand += "SD0"; if (dLineStr.length() < 3) for (int i = 0; i < 3 - dLineStr.length(); i++) controllCommand += "0"; controllCommand += dLineStr + "#"; } QSerialPort* Port = bridge.back.getSerialPort(Name); if (Port != NULL) { Port->write(controllCommand.c_str()); Port->waitForBytesWritten(); } } void MyThread::takeImg(unsigned long long timeCode, filmMode type, QString name,detData * datas,QString FinsAfter) { finsAfter = FinsAfter; if (currentHash != 0)//currentHash会在完成触发后清零,在runCameraModule() qDebug() << "[WARNING]当前模块似乎有没完成的触发,请检查信号是否完整 hashCode:" << currentHash; globalMode = type; if (name != "") { m_name = name; } else { m_name = m_staticName; } gloabalMats = &datas->imgs; currentHash = timeCode; globalDetData = datas; this->start(); } bool MyThread::runCameraModule() { QByteArray task_name; std::vector camera_mat; // 判断触发模式 if (m_triggermodel.contains("software")) { camera_mat = cameraModule(globalMode); } else if (m_triggermodel.contains("hardware")) // 硬触发 hardware_trigger { camera_mat = cameraModule(hardware_trigger); } if (finsAfter != "") bridge.back.sendFinsMsg(finsAfter); if (camera_mat.empty()) { qCritical() << "[Error] " << " camera_mat is null! "; return false; } mutex.lock(); #if 0 //使用容器 bug cameraImgsPtr->insertImg(currentHash, &camera_mat); #endif #if 1//使用指针 if (gloabalMats != nullptr) { if (globalDetData != nullptr) { //globalDetData->imgsMutex.lock(); for (auto img : camera_mat) gloabalMats->push_back(img); //globalDetData->imgsMutex.unlock(); } else { for (auto img : camera_mat) gloabalMats->push_back(img); } cout << "sucess" << currentHash << endl; } #endif globalDetData = nullptr; mutex.unlock(); camera_mat.clear(); currentHash = 0; return true; } std::vector MyThread::getImage(int amount) { std::vector mats; if (detImgVec.size() < amount)//数量不满足要求 return mats; mutex.lock(); mats.swap(detImgVec); mutex.unlock(); return mats; } std::vector MyThread::cameraModule(filmMode type) { std::vector mats; QByteArray task_name; std::vector camera_mat; cv::Mat a, b, c; switch (type) { case MyThread::hardware_trigger: getImageFromCamera(camera_mat); break; case MyThread::normal: if (!cameraTrigger()) { cv::Mat nullMat = cv::Mat::zeros(cv::Size(500, 500), CV_8UC1); camera_mat.push_back(nullMat); } else { getImageFromCamera(camera_mat); } break; } return camera_mat; } bool MyThread::sendDataCommond(QString m_type, cv::Mat mat, QByteArray byte) { QMutexLocker locker(m_mutex); // 加锁 dataPack m_pack; m_pack.mat = mat; m_pack.byte = byte; m_pack.retFlag = m_type; m_pack.name = m_name;//名字 m_pack.showIndex = showIndex;//第几个窗口 // 界面显示包 ImageDataPack.append(m_pack); QMetaObject::invokeMethod(m_obj, "reciveImageData"); return true; }