#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, int targetCntInput) { 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; targetCnt = targetCntInput; this->start(); } bool MyThread::runCameraModule() { // 判断触发模式 if (m_triggermodel.contains("software")) { QByteArray task_name; std::vector camera_mat; camera_mat = cameraModule(globalMode); 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) { if (targetCnt != 0) { int waitCnt = 0; while (globalDetData->cnt != targetCnt|| waitCnt>200) { QThread::msleep(10); waitCnt++; } if(waitCnt<200) for (auto img : camera_mat) gloabalMats->push_back(img); } else for (auto img : camera_mat) gloabalMats->push_back(img); globalDetData->cnt++; //globalDetData->mutexx->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; } else if (m_triggermodel.contains("hardware")) // 硬触发 hardware_trigger { QByteArray task_name; std::vector camera_mat; camera_mat = cameraModule(MyThread::hardware_trigger);//触发 if (finsAfter != "") bridge.back.sendFinsMsg(finsAfter); if (camera_mat.empty()) { qCritical() << "[Error] " << " camera_mat is null! "<insertImg(currentHash, &camera_mat); #endif #if 1//使用指针 if (gloabalMats != nullptr) { if (globalDetData != nullptr) { if (targetCnt != 0) { int waitCnt = 0; while (globalDetData->cnt != targetCnt || waitCnt > 200) { QThread::msleep(10); waitCnt++; } if (waitCnt < 200) for (auto img : camera_mat) gloabalMats->push_back(img); } else for (auto img : camera_mat) gloabalMats->push_back(img); globalDetData->cnt++; //globalDetData->mutexx->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; } #if 0 else if (m_triggermodel.contains("hardware")) // 硬触发 hardware_trigger { while (true) { if (!m_stoprun) { return true; } if (!m_Module.module_ptr->run()) { QThread::msleep(5); continue; } QByteArray task_name; std::vector get_mat; if (!m_Module.module_ptr->sendData(get_mat, task_name)) { qDebug() << "[Error] " << " sendData is error! "; QThread::msleep(5); continue; } if (get_mat.empty()) { continue; } mutex.lock(); for (auto img : get_mat) detImgVec.push_back(img); mutex.unlock(); get_mat.clear(); currentHash = 0; } } #endif 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; case MyThread::_2dSpecialP: bridge.back.QSerialPorts[0]->write("SA0200#SB0000#SC0120#");//第一次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); QThread::msleep(100); //////第一次拍照////////// cameraTrigger(); getImageFromCamera(camera_mat); /////第二次拍照//////////// setExposureTime(300); bridge.back.QSerialPorts[0]->write("SA0200#SB0100#SC0000#");//第二次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); QThread::msleep(100); cameraTrigger(); getImageFromCamera(camera_mat); /////第三次拍照//////////// bridge.back.QSerialPorts[0]->write("SA0255#SB0255#SC0255#");//第三次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); setExposureTime(2500); QThread::msleep(200); cameraTrigger(); getImageFromCamera(camera_mat); /////为第一次拍照准备的设置//////// setExposureTime(300); bridge.back.QSerialPorts[0]->write("SA0200#SB0000#SC0120#");//第一次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); break; case MyThread::_2dSpecialN: bridge.back.QSerialPorts[0]->write("SA0200#SB0000#SC0120#");//第一次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); QThread::msleep(100); //////第一次拍照////////// cameraTrigger(); getImageFromCamera(camera_mat); /////第二次拍照//////////// setExposureTime(300); bridge.back.QSerialPorts[0]->write("SA0200#SB0100#SC0000#");//第二次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); QThread::msleep(100); cameraTrigger(); getImageFromCamera(camera_mat); /////第三次拍照//////////// bridge.back.QSerialPorts[0]->write("SA0255#SB0255#SC0255#");//第三次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); setExposureTime(600); QThread::msleep(200); cameraTrigger(); getImageFromCamera(camera_mat); /////为第一次拍照准备的设置//////// setExposureTime(300); bridge.back.QSerialPorts[0]->write("SA0200#SB0000#SC0120#");//第一次拍照亮度 bridge.back.QSerialPorts[0]->waitForBytesWritten(); //setLightSourceValue(200, 0, 120, 0, "2dLightSource"); 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; }