#include "DsgRoiDlg.h" #include "ui_RoiDlg.h" #include "colossusbase.h" #include "QPalette" #pragma execution_character_set("utf-8") /* RECTANGLE = 0, CIRCLE, ELLIPSE, POLY */ bool subDevListSort(const Item_List &info1, const Item_List &info2) { if (info1.size() < 0 || info2.size() < 0) return false; if (info1.at(0).first == info2.at(0).first) { if (info1.at(0).first == CIRCLE) return info1.at(0).second.at(2) < info2.at(0).second.at(2); if (info1.at(0).first == RECTANGLE) { double info1Min = info1.at(0).second.at(2) < info1.at(0).second.at(3) ? info1.at(0).second.at(2) : info1.at(0).second.at(3); double info2Min = info2.at(0).second.at(2) < info2.at(0).second.at(3) ? info2.at(0).second.at(2) : info2.at(0).second.at(3); return info1Min < info2Min; } if (info1.at(0).first == ELLIPSE) { double info1Min = info1.at(0).second.at(2) < info1.at(0).second.at(3) ? info1.at(0).second.at(2) : info1.at(0).second.at(3); double info2Min = info2.at(0).second.at(2) < info2.at(0).second.at(3) ? info2.at(0).second.at(2) : info2.at(0).second.at(3); return info1Min < info2Min; } } else return info1.at(0).second.at(2) < info2.at(0).second.at(2); return false; } CDsgRoiDlg::CDsgRoiDlg(QWidget *parent) : QDialog(parent), ui(new Ui::RoiDlg) { m_pDE = NULL; m_pTask = NULL; ui->setupUi(this); setWindowIcon(QIcon(":/img/resource/app.png")); SystemStateInfo::rgb = QColor(255, 0, 0).rgb(); connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(OnOk())); connect(ui->pushButton_2, SIGNAL(clicked()), this, SLOT(OnCancel())); //connect(ui->pushButton_3, SIGNAL(clicked()), this, SLOT(OnRectangle())); connect(ui->pushButton_7, SIGNAL(clicked()), this, SLOT(OnCircle())); //connect(ui->pushButton_4, SIGNAL(clicked()), this, SLOT(OnEllipse())); connect(ui->pushButton_8, SIGNAL(clicked()), this, SLOT(OnShowColorDlg())); ui->pushButton_8->setAutoDefault(false); connect(ui->pushButton_9, SIGNAL(clicked()), this, SLOT(OnSetItem())); connect(ui->pushButton_10, SIGNAL(clicked()), this, SLOT(OnMove())); connect(ui->pushButton_11, SIGNAL(clicked()), this, SLOT(OnMove())); connect(ui->pushButton_12, SIGNAL(clicked()), this, SLOT(OnMove())); connect(ui->pushButton_13, SIGNAL(clicked()), this, SLOT(OnMove())); connect(ui->pushButton_14, SIGNAL(clicked()), this, SLOT(OnSelectImage())); connect(ui->pushButton_15, SIGNAL(clicked()), this, SLOT(OnSnapCameraImage())); connect(ui->pushButton_16, SIGNAL(clicked()), this, SLOT(OnZoomOut())); connect(ui->pushButton_17, SIGNAL(clicked()), this, SLOT(OnZoomIn())); connect(this, SIGNAL(sgShowCameraImage(QImage)), this, SLOT(OnShowCameraImage(QImage))); connect(ui->pushButton_5, SIGNAL(clicked()), this, SLOT(OnShowTenFlag())); ui->pushButton_5->setText(QObject::tr("显示定位线")); m_pRoiScene = new RoiScene(this); //m_pRoiScene->SetRoiDlg(this); m_pRoiScene->SetGraphicsView(ui->graphicsView); m_pRoiScene->SetInfoLable(ui->label_pixel_info); // Qt::WindowFlags flags = Qt::Dialog; // flags |= Qt::WindowMinMaxButtonsHint; // flags |= Qt::WindowCloseButtonHint; // setWindowFlags(flags); } CDsgRoiDlg::~CDsgRoiDlg() { if (m_pRoiScene) { delete m_pRoiScene; m_pRoiScene = nullptr; } } bool CDsgRoiDlg::Initialize(IDetectorEngine* pDE, IDetectorAlgorithm* pAlgo, IDetectorTask* pTask) { if (!pDE || !pAlgo || !pTask) return false; m_pDE = pDE; m_pTask = pTask; void* p; m_pDE->GetDataInterface(DEVICEMGR, &p); m_pDeviceMgr = (IDetectorDeviceMgr*)p; if (!InitGraphView()) return false; return true; } bool CDsgRoiDlg::InitGraphView() { ui->pushButton_5->setText(QObject::tr("显示定位线")); ui->graphicsView->setUserData(0, (QObjectUserData*)1); ui->graphicsView->setScene(m_pRoiScene); ui->graphicsView->setRenderHint(QPainter::Antialiasing); ui->graphicsView->setResizeAnchor(QGraphicsView::AnchorUnderMouse); ui->graphicsView->setTransformationAnchor(QGraphicsView::AnchorUnderMouse); m_pRoiScene->updateTenItem(false); m_pRoiScene->update(); ui->graphicsView->update(); return true; } bool CDsgRoiDlg::OnOk() { //TODO 检查绑定内容 QList items = m_pRoiScene->items(); QList temp; int nSize = items.size(); for (int i = 0; i < nSize; i++) { GraphicsItem *item = qgraphicsitem_cast(items.at(i)); if (item && item->GetLock()) { temp.push_back(item); } } int nCount = temp.size(); int nItems = m_pRoiScene->getGraphItems(); if (nCount != nItems) { int a = QMessageBox::warning(this, QObject::tr("警告"), QObject::tr("系统检测到有ROI未进行绑定,请绑定后继续!!!")); return false; } QDialog::accept(); return true; } bool CDsgRoiDlg::OnCancel() { QDialog::reject(); return true; } void CDsgRoiDlg::OnRectangle() { DrawTool::c_drawShape = rectangle; } void CDsgRoiDlg::OnCircle() { DrawTool::c_drawShape = circle; } void CDsgRoiDlg::OnEllipse() { DrawTool::c_drawShape = ellipse; } void CDsgRoiDlg::OnShowColorDlg() { QColor color = QColorDialog::getColor(Qt::black,this,QString("select color")); if (color.rgb() == QColor(0, 0, 0).rgb()) return ; QString strRGB = QString("(%1,%2,%3)").arg(QString::number(color.red()), QString::number(color.green()), QString::number(color.blue())); ui->lineEdit_3->setText(strRGB); ui->lineEdit_3->setUserData(0, (QObjectUserData*)color.rgb()); QString strStyle = QString("background-color:rgba(%1,%2,%3,255);").arg(color.red()).arg(color.green()).arg(color.blue()); ui->lineEdit_3->setStyleSheet(strStyle); SystemStateInfo::rgb = color.rgb(); return; } void CDsgRoiDlg::OnShowCameraImage(QImage img) { m_tempRoiData.img = ColossusBase::QImage2cvMat(img).clone(); m_pRoiScene->Initialize(m_tempRoiData); m_pRoiScene->DisableMenu(false); //m_pRoiScene->updateTenItem(true); } void CDsgRoiDlg::OnShowTenFlag() { QString strtext = ui->pushButton_5->text(); if (strtext == QObject::tr("显示定位线")) { m_pRoiScene->updateTenItem(true); ui->pushButton_5->setText(QObject::tr("隐藏定位线")); } else { m_pRoiScene->updateTenItem(false); ui->pushButton_5->setText(QObject::tr("显示定位线")); } } void __stdcall RoiImageEventHandler(void * callBackOwner, QImage& img, int nDeviceID) { CDsgRoiDlg* p = (CDsgRoiDlg*)(callBackOwner); emit p->sgShowCameraImage(img); } void CDsgRoiDlg::OnSnapCameraImage() { DeviceType type; IDetectorCameraDevice* pCamera = (IDetectorCameraDevice*)m_pDeviceMgr->GetDevice(m_pTask->GetTaskInfo()->nCameraID, type); if (!pCamera && type != CAMERA) return; pCamera->SnapImage(this, RoiImageEventHandler); } void CDsgRoiDlg::OnSelectImage() { QString strFileName = QFileDialog::getOpenFileName(this, "open file", "", "Images (*.bmp *.png *.xpm *.jpg)"); if (strFileName.length() > 0) { std::string strpath = strFileName.toLocal8Bit().toStdString(); m_tempRoiData.img = cv::imread(strpath/*strFileName.toLocal8Bit().data()*/, CV_LOAD_IMAGE_UNCHANGED); // m_tempRoiData.img = cv::imread(strFileName.toLatin1().data()); // m_pRoiScene->InitShowImage(m_tempRoiData.img); m_pRoiScene->Initialize(m_tempRoiData); m_pRoiScene->DisableMenu(false); } } LP_DETECTOR_ROI_DATA CDsgRoiDlg::ShowRoiDlg(LP_DETECTOR_ROI_DATA roiData) { m_tempRoiData = roiData; SystemStateInfo::rgb = SystemStateInfo::setIni.value("roi_color").toInt(); if (SystemStateInfo::rgb == 0) SystemStateInfo::rgb = QColor(255, 0, 0).rgb(); QColor color(SystemStateInfo::rgb); QString strRGB = QString("(%1,%2,%3)").arg(QString::number(color.red()), QString::number(color.green()), QString::number(color.blue())); ui->lineEdit_3->setText(strRGB); ui->lineEdit_3->setUserData(0, (QObjectUserData*)color.rgb()); QString strStyle = QString("background-color:rgba(%1,%2,%3,255);").arg(color.red()).arg(color.green()).arg(color.blue()); ui->lineEdit_3->setStyleSheet(strStyle); QDesktopWidget* desktop = QApplication::desktop();// move((desktop->width() - this->width()) / 2, (desktop->height() - this->height()) / 2); if (this->exec() == QDialog::Accepted) { FillRoi(m_tempRoiData); m_pRoiScene->DisableMenu(true); SystemStateInfo::setIni.setValue(QStringLiteral("roi_color"), SystemStateInfo::rgb); return m_tempRoiData; } m_pRoiScene->DisableMenu(true); return roiData; } bool CDsgRoiDlg::FillRoi(LP_DETECTOR_ROI_DATA& roiData) { roiData.records.clear(); QList items = m_pRoiScene->items(); QList temp; int nSize = items.size(); for (int i = 0; i < nSize; i++) { GraphicsItem *item = qgraphicsitem_cast(items.at(i)); if (item && item->GetLock()) { temp.push_back(item); } } int nCount = temp.size(); Record_List records; for (int j = 0; j < nCount; j++) { GraphicsItem *item = temp.at(j); Item_List record; { { Feature_List tItem; ItemType type = item->GetType(); QRectF itemRect = item->mapRectToScene(item->boundingRect());; QPointF itemPoint = item->pos() + m_pRoiScene->GetOffSet(); switch (type) { case GraphicsRect: { tItem.first = RECTANGLE; if (!roiData.img.empty()){ if (itemRect.x() < -(roiData.img.cols / 2)) { itemRect.setX(-(roiData.img.cols / 2)); itemPoint.setX(itemPoint.x() + itemRect.width()); } if (itemRect.y() < -(roiData.img.rows / 2)) { itemRect.setY(-(roiData.img.rows / 2)); itemPoint.setY(itemPoint.y() + itemRect.width()); } if (itemRect.x() + itemRect.width() > roiData.img.cols / 2) { int width = itemRect.width(); itemRect.setX(roiData.img.cols / 2 - width); itemRect.setWidth(width); itemPoint.setX(itemPoint.x() - width / 2); } if (itemRect.y() + itemRect.height() > roiData.img.rows / 2) { int width = itemRect.height(); itemRect.setY(roiData.img.rows / 2 - width); itemRect.setHeight(width); itemPoint.setY(itemPoint.y() - width / 2); } if (itemRect.width() > roiData.img.cols / 2 || itemRect.height() > roiData.img.rows / 2) { itemRect.setWidth(roiData.img.cols); itemRect.setHeight(roiData.img.rows); itemPoint.setY(roiData.img.rows / 2); itemPoint.setX(roiData.img.cols / 2); } } tItem.second.push_back(itemPoint.x()); tItem.second.push_back(itemPoint.y()); tItem.second.push_back(itemRect.width()); tItem.second.push_back(itemRect.height()); break; } case GraphicsCircle: { tItem.first = CIRCLE; if (!roiData.img.empty()){ if (itemRect.x() < -(roiData.img.cols/2)) { itemRect.setX(-(roiData.img.cols / 2)); itemPoint.setX(itemPoint.x() + itemRect.width()); } if (itemRect.y() < -(roiData.img.rows / 2)) { itemRect.setY(-(roiData.img.rows / 2)); itemPoint.setY(itemPoint.y() + itemRect.width()); } if (itemRect.x()+itemRect.width() > roiData.img.cols / 2) { int width = itemRect.width(); itemRect.setX(roiData.img.cols / 2-width); itemRect.setWidth(width); itemPoint.setX(itemPoint.x() - width / 2); } if (itemRect.y() + itemRect.width() > roiData.img.rows / 2) { int width = itemRect.width(); itemRect.setY(roiData.img.rows / 2-width); itemRect.setWidth(width); itemPoint.setY(itemPoint.y() - width / 2); } if (itemRect.width() > roiData.img.rows/2||itemRect.height()>roiData.img.cols/2) { int minWidth = 100; if (roiData.img.rows > roiData.img.cols) minWidth = roiData.img.cols; else minWidth = roiData.img.rows; itemRect.setWidth(minWidth); itemRect.setHeight(minWidth); itemPoint.setY(roiData.img.rows / 2); itemPoint.setX(roiData.img.cols / 2); } } tItem.second.push_back(itemPoint.x()); tItem.second.push_back(itemPoint.y()); tItem.second.push_back(itemRect.width() / 2); break; } case GraphicsEllipse: { if (!roiData.img.empty()){ if (itemRect.x() < -(roiData.img.cols / 2)) { itemRect.setX(-(roiData.img.cols / 2)); itemPoint.setX(itemPoint.x() + itemRect.width()); } if (itemRect.y() < -(roiData.img.rows / 2)) { itemRect.setY(-(roiData.img.rows / 2)); itemPoint.setY(itemPoint.y() + itemRect.width()); } if (itemRect.x() + itemRect.width() > roiData.img.cols / 2) { int width = itemRect.width(); itemRect.setX(roiData.img.cols / 2 - width); itemRect.setWidth(width); itemPoint.setX(itemPoint.x() - width / 2); } if (itemRect.y() + itemRect.height() > roiData.img.rows / 2) { int width = itemRect.height(); itemRect.setY(roiData.img.rows / 2 - width); itemRect.setHeight(width); itemPoint.setY(itemPoint.y() - width / 2); } if (itemRect.width() > roiData.img.cols / 2 || itemRect.height() > roiData.img.rows / 2) { itemRect.setWidth(roiData.img.cols); itemRect.setHeight(roiData.img.rows); itemPoint.setY(roiData.img.rows / 2); itemPoint.setX(roiData.img.cols / 2); } } tItem.first = ELLIPSE; tItem.second.push_back(itemPoint.x()); tItem.second.push_back(itemPoint.y()); tItem.second.push_back(itemRect.width() / 2); tItem.second.push_back(itemRect.height() / 2); break; } case GraphicsPoly: break; default: break; } record.push_back(tItem); } records.push_back(record); //delete[] lppItem; delete item; } } if (records.size() > 1){ //排序 ROI最小的放在前面 qSort(records.begin(), records.end(), subDevListSort); } roiData.records=records;// return true; } void CDsgRoiDlg::CleanUp() { } void CDsgRoiDlg::OnMove() { if (!m_pRoiScene) return; if (sender()->objectName() == "pushButton_10") { m_pRoiScene->MoveSelectedItem(LEFT); } else if (sender()->objectName() == "pushButton_11") { m_pRoiScene->MoveSelectedItem(UP); } else if (sender()->objectName() == "pushButton_12") { m_pRoiScene->MoveSelectedItem(RIGHT); } else if (sender()->objectName() == "pushButton_13") { m_pRoiScene->MoveSelectedItem(DOWN); } } void CDsgRoiDlg::OnSetItem() { //QList items = m_pTaskScene->items(); //GraphicsItem *item1; //GraphicsItem *item2; //int nSize = items.size(); //for (int i = 0; i < nSize; i++) //{ // GraphicsItem *item = qgraphicsitem_cast(items.at(i)); // if (item && item->GetType() == GraphicsRect) // { // // item1 = item; // } // if (item && item->GetType() == GraphicsCircle) // { // item2 = item; // } //} //QList temp1 = item1->collidingItems(Qt::ContainsItemShape); // int b = temp1.size(); //for (int k = 0; k < b; k++) //{ // int aa = temp1.at(k)->type(); // int bb = temp1.at(k)->Type; //} //QList temp2 = item2->collidingItems(Qt::ContainsItemShape); //int c = temp2.size(); //bool bRet1 = item1->collidesWithItem(item2, Qt::ContainsItemShape); //bool bRet2 = item2->collidesWithItem(item1, Qt::ContainsItemShape); //QPointF pos1 = item1->pos(); //QPointF pos2 = item2->pos(); //int a = 0; QPoint pos; QRect size; pos.setX(ui->lineEdit_4->text().toInt() - m_pRoiScene->GetOffSet().x()); pos.setY(ui->lineEdit_5->text().toInt() - m_pRoiScene->GetOffSet().y()); size.setWidth(ui->lineEdit_6->text().toInt()); size.setHeight(ui->lineEdit_7->text().toInt()); m_pRoiScene->SetSelectedItem(pos, size); } void CDsgRoiDlg::ResetItem(QPoint pos, QRect size) { ui->lineEdit_4->clear(); ui->lineEdit_5->clear(); ui->lineEdit_6->clear(); ui->lineEdit_7->clear(); ui->lineEdit_4->setText(QString::number(pos.x())); ui->lineEdit_5->setText(QString::number(pos.y())); ui->lineEdit_6->setText(QString::number(size.width())); ui->lineEdit_7->setText(QString::number(size.height())); } void CDsgRoiDlg::showEvent(QShowEvent *evt) { m_pRoiScene->Initialize(m_tempRoiData); m_pRoiScene->DisableMenu(false); ui->lineEdit_4->clear(); ui->lineEdit_5->clear(); ui->lineEdit_6->clear(); ui->lineEdit_7->clear(); } void CDsgRoiDlg::OnZoomIn() { m_pRoiScene->zoomImage(true); } void CDsgRoiDlg::OnZoomOut() { m_pRoiScene->zoomImage(false); }