#include "camerapar.h" #include "ui_camerapar.h" #include"general/xmloperate.h" #include #include"general/generalfunc.h" #include #include #include #include #include "container/threadsafequeue.h" #include CameraPar::CameraPar(QWidget *parent) : QWidget(parent), ui(new Ui::CameraPar) { ui->setupUi(this); m_timer = new QTimer(this); connect(m_timer, SIGNAL(timeout()), this, SLOT(realTimeShowImage())); connect(this, SIGNAL(sig_infoDisplay(QString , int)), this, SLOT(printLog(QString , int))); ui->BTN_cameraSearch->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS); ui->BTN_connCamera->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS); ui->BTN_disconnCamera->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS); ui->BTN_softTriggerOnce->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS); ui->BTN_saveConfig->setStyleSheet(ST_CAMERA_PAR_BUTTON_QSS); ui->PGB_imgSharpness->setMinimum(-1); ui->PGB_imgSharpness->setMaximum(-1); ui->PGB_imgSharpness->setValue(-1); ui->PGB_imgSharpness->setStyleSheet(ST_QProgressBar_QSS); //m_isCamConnected = false; //ui->WGT_cam->setEnabled(false); //ui->WGT_camConfig->setEnabled(false); //ui->WGT_imgSharpProgress->setRange(0, 100); //ui->WGT_imgSharpProgress->setValue(50); // //ui->DSPB_exp->setStyleSheet(ST_DOUBLE_SPIN_BOX_QSS); //ui->DSPB_gain->setStyleSheet(ST_DOUBLE_SPIN_BOX_QSS); } CameraPar::~CameraPar() { delete ui; } //初始化变量 void CameraPar::initPar(QString pro_path) { GeneralFunc::isDirExist(pro_path+"\\camera",true); cam_config_path=pro_path+"\\camera\\CamConfig.xml"; XmlOperate m_xml; m_xml.openXml(cam_config_path); camList=m_xml.getChild(QStringList()); m_xml.closeXml(); initUI(); } //初始化UI void CameraPar::initUI() { //ui->cbboxCamList->clear(); //ui->cbboxCamList->addItems(camList); } //在关闭前发送设置变化的信号 void CameraPar::closeEvent(QCloseEvent *event) { event->accept(); } //界面上打印log void CameraPar::printLog(QString str, int logType) { if (logType <= 1) { ui->LABLE_logIcon->setStyleSheet(QString("")); // border - image: url(: / Assets / View / info.png); } else if (logType == 2) { ui->LABLE_logIcon->setStyleSheet(QString("border-image: url(:/Assets/View/warn.png);")); } else { ui->LABLE_logIcon->setStyleSheet(QString("border-image: url(:/Assets/View/error.png);")); } ui->LABLE_log->setText(str); } //写入相机设置 void CameraPar::on_pbtnWrite_clicked() { this->hide(); //XmlOperate m_xml; //m_xml.openXml(cam_config_path); //QString text=ui->cbboxCamList->currentText(); //m_xml.addNode(QStringList()<cbboxCamType->currentText()); //m_xml.addNode(QStringList()<ledtSerialNum->text()); //m_xml.addNode(QStringList()<ledtResolution->text()); //m_xml.addNode(QStringList()<ledtExpTime->text()); //m_xml.addNode(QStringList()<ledtGain->text()); //m_xml.addNode(QStringList()<ledtTimeDelay->text()); //m_xml.addNode(QStringList()<cbboxTriggerMode->currentText()); //m_xml.addNode(QStringList()<cbboxTriggerSource->currentText()); //m_xml.addNode(QStringList()<ledtCamStepAll->text()); //m_xml.closeXml(); //emit signal_cam_change(text); } //增加一个相机配置 void CameraPar::on_pbtnAddCam_clicked() { //QString settext=ui->ledtCamName->text(); //ui->cbboxCamList->addItem(settext); //camList<cbboxCamList->setCurrentText(settext); //ui->cbboxCamType->setCurrentIndex(0); //ui->ledtSerialNum->setText(tr(QString::fromLocal8Bit("型号:序列号").toUtf8())); //ui->ledtResolution->setText(tr(QString::fromLocal8Bit("width:height").toUtf8())); //ui->ledtExpTime->setText(QString::fromLocal8Bit("10000")); //ui->ledtGain->setText("0"); //ui->ledtTimeDelay->setText(QString::fromLocal8Bit("10")); //ui->cbboxTriggerMode->setCurrentText("0"); //ui->cbboxTriggerSource->setCurrentText("7"); //ui->ledtCamStepAll->setText("step0"); } //选择相机时更新界面 void CameraPar::on_cbboxCamList_currentTextChanged(const QString &arg1) { /* XmlOperate m_xml; m_xml.openXml(cam_config_path); ui->cbboxCamType->setCurrentText(m_xml.readNode(QStringList()<ledtSerialNum->setText(m_xml.readNode(QStringList()<ledtResolution->setText(m_xml.readNode(QStringList()<ledtExpTime->setText(m_xml.readNode(QStringList()<ledtGain->setText(m_xml.readNode(QStringList()<ledtTimeDelay->setText(m_xml.readNode(QStringList()<cbboxTriggerMode->setCurrentText(m_xml.readNode(QStringList()<cbboxTriggerSource->setCurrentText(m_xml.readNode(QStringList()<ledtCamStepAll->setText(m_xml.readNode(QStringList()<cbboxCamList->currentText()); //m_xml.closeXml(); //ui->cbboxCamList->removeItem(ui->cbboxCamList->currentIndex()); } } void CameraPar::on_BTN_softTriggerOnce_clicked() { if (DataVar::g_camTriggerMode == 1) { cv::Mat img; int ret = DataVar::g_camera->takeSingleImage(img); if (ret == 0 && !img.empty()) { updateImageScale(ui->LABEL_showWindow, img); } //DataVar::g_camera->softTriggerOnce(); } if (DataVar::g_camTriggerMode == 5) { int ret = DataVar::g_camera->softTriggerOnce(); } } void CameraPar::on_DSPB_exp_valueChanged(double v) { DataVar::g_camera->setExposureTime(v); } void CameraPar::on_DSPB_gain_valueChanged(double v) { DataVar::g_camera->setGain(v); } void CameraPar::on_SPB_delay_valueChanged(int v) { DataVar::g_camera->setTriggerDelay(v); } void CameraPar::on_CBBOX_triggerMode_currentIndexChanged(int id) { if (id == 0) { //if (!m_timer->isActive()) // m_timer->start(50); DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE(0)); DataVar::g_camTriggerMode = 0; } else { //if (m_timer->isActive()) // m_timer->stop(); DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE(1)); DataVar::g_camera->setTriggerSource(CvxCamera::E_TRIGGER_SOURCE(id - 1)); DataVar::g_camTriggerMode = id; } DataVar::g_imgsQueue.clear();//清空队列 } /*****************相机搜索*****************/ void CameraPar::on_BTN_cameraSearch_clicked() { if (DataVar::g_isCamConnected) { QMESSAGEBOX_ERROR(QStringLiteral("请先断开相机!")); return; } ui->CBX_camSn->clear(); std::vector vecCamSn; DataVar::g_camera->enumDevicesSN(vecCamSn); if (vecCamSn.size() == 0) { emit sig_infoDisplay(QStringLiteral("未搜索到相机!"),2); } else { ui->WGT_cam->setEnabled(true); } for (auto i : vecCamSn) { ui->CBX_camSn->addItem(QString::fromStdString(i)); } } /*****************连接相机*****************/ void CameraPar::on_BTN_connCamera_clicked() { if (DataVar::g_isCamConnected) { emit sig_infoDisplay(QStringLiteral("相机已经连接!!"), 2); return; } std::string sn = ui->CBX_camSn->currentText().toStdString(); int ret = DataVar::g_camera->openCamera(sn.c_str()); if (ret != 0) { emit sig_infoDisplay(QStringLiteral("相机连接失败!!"), 3); return; } DataVar::g_camera->setInitParameters(); LOG_DEBUG("connect camera %s succeed !!", sn.c_str()); ret = DataVar::g_camera->setTriggerMode(CvxCamera::E_TRIGGER_MODE::TRIGGER_MODE_OFF); ret = DataVar::g_camera->setTriggerSource(CvxCamera::E_TRIGGER_SOURCE::TRIGGER_SOURCE_SOFT); LOG_DEBUG("camera %s set soft trigger succeed!!", sn.c_str()); ret = DataVar::g_camera->setTriggerDelay(0); ret = DataVar::g_camera->startGrabbing(); LOG_DEBUG("camera %s startGrabbing !!", sn.c_str()); DataVar::g_camTriggerMode = 0; emit sig_infoDisplay(QStringLiteral("相机连接成功!!")); DataVar::g_isCamConnected = true; ui->WGT_camConfig->setEnabled(true); updataCamInfoToForm(); } /*****************断开相机连接*****************/ void CameraPar::on_BTN_disconnCamera_clicked() { int ret = DataVar::g_camera->closeCamera(); if (ret != 0) { emit sig_infoDisplay(QStringLiteral("相机断开失败!!"), 2); return; } emit sig_infoDisplay(QStringLiteral("相机断开连接!!")); DataVar::g_isCamConnected = false; ui->WGT_camConfig->setEnabled(false); } /*****************更新相机配置信息到UI*****************/ void CameraPar::updataCamInfoToForm() { ui->DSPB_exp->setValue(DataVar::g_camera->getExposureTime()); ui->DSPB_gain->setValue(DataVar::g_camera->getGain()); ui->CBBOX_triggerMode->setCurrentIndex(0); } void CameraPar::realTimeShowImage() { double scaleW; double scaleH; double offsetX; double offsetY; QRect qroi; cv::Rect roi; int x, y, w, h; //为了保证算法取图引起相片资源竞争,g_imgsQueue里面经常留一张图片 if (DataVar::g_camRealTimeShowMode == 2) { cv::Mat src; if (DataVar::g_imgsQueue.pop(src)) { if (!src.empty()) { qroi = ui->LABEL_showWindow->getRect(); updateImageScale(ui->LABEL_showWindow, src, scaleW,scaleH,offsetX,offsetY); if (!qroi.isNull()) { x = (qroi.x() + offsetX) / scaleW; y = (qroi.y() + offsetY) / scaleH; w = qroi.width() / scaleW; h = qroi.height() / scaleH; cv::Rect roi = cv::Rect(x, y, w, h) & cv::Rect(0,0, src.size().width,src.size().height); float score = AutoFocus::AF_Sobel(src(roi)); int v = roundf(score * 100); if (v < ui->PGB_imgSharpness->minimum() || ui->PGB_imgSharpness->minimum()<0) ui->PGB_imgSharpness->setMinimum(v); else if (v > ui->PGB_imgSharpness->maximum() || ui->PGB_imgSharpness->maximum() < 0) ui->PGB_imgSharpness->setMaximum(v); ui->PGB_imgSharpness->setValue(v); //ui->LABLE_imgSharpness->setText(QString::number(v)); } } } //src = DataVar::g_imgsQueue.dequeue(); } } void CameraPar::showEvent(QShowEvent* event) { DataVar::g_camRealTimeShowMode = 2; //相机配置窗口显示 if (DataVar::g_camTriggerMode == 0) m_timer->start(50); } void CameraPar::hideEvent(QHideEvent* event) { if (DataVar::g_camTriggerMode == 0) DataVar::g_camRealTimeShowMode = 1; //主界面窗口显示 else DataVar::g_camRealTimeShowMode = 0; //不实时显示 }