#include "ToolDialog.h" #include #include #include #include #include ToolDialogImpl::ToolDialogImpl(QWidget* parent) : DllToolDialog(parent) { ui.setupUi(this); this->setWindowFlags(Qt::Dialog | Qt::WindowMaximizeButtonHint | Qt::WindowCloseButtonHint /*| Qt::WindowStaysOnTopHint*/); connect(this, SIGNAL(sigUpdateUI()), this, SLOT(on_UpdateUI())); // 显示控件初始化 hwndUnit = new HWndUnit(this); Util::ShowUnitInWidget(ui.Image_widget, hwndUnit); hwndUnit->getHWndCtrl()->useROIController(&m_RoiController); connect(&m_RoiController, SIGNAL(ROIChange(const ViewMessage)), this, SLOT(on_ROIChange(const ViewMessage))); ROIRect1* roi = new ROIRect1(); roi->setTitle("搜索区域"); m_RoiController.setROISign(ROIOperation::Negative); m_RoiController.setROIShape(roi); m_RoiController.mouseDownAction(500, 500); // QString strPath = QCoreApplication::applicationDirPath() +"/Test.jpg" ; // try // { // m_Image.ReadImage(strPath.toStdString().c_str()); // hwndUnit->ShowImage(m_Image); // hwndUnit->Refresh(false); // } // catch (...) // { // } initValue(); } ToolDialogImpl::~ToolDialogImpl() { } VPEnum::RETURN_VALUE ToolDialogImpl::Execute() { //////////////////////////////首先清理输出端口的数据//////////////////////////////////////////// m_AffineTransImage.Clear(); m_CropImage.Clear(); m_Position.Clear(); m_nStatus = 0; m_nNumber = 0; //////////////////////////////清理输出端口的数据完成//////////////////////////////////////////// try { hwndUnit->ShowImage(m_Image); hwndUnit->ShowObj(m_objROI, QColor(0, 255, 0)); if (m_Image.IsInitialized() && m_tModelID.TupleIsHandle()) { HObject ho_TemplateImage; ReduceDomain(m_Image, m_objROI, &ho_TemplateImage); int m_nAngleStart = 0; int m_nAngleExtent = 360; double m_fScaleRMin = 1.0; double m_fScaleRMax = 1.0; HTuple m_hvSubPixel = "least_squares"; HTuple m_nNumLevels = 0; m_nMinScore = ui.spinBox_MinScore->value(); m_nTimeOut = ui.spinBox_TimeOut->value(); m_nMaxOverlap = ui.spinBox_MaxOverlap->value(); m_nNumMatches = ui.spinBox_NumMatches->value(); m_nGreediness = ui.spinBox_Greediness->value(); SetGenericShapeModelParam(m_tModelID, "min_score", m_nMinScore / 100.0); SetGenericShapeModelParam(m_tModelID, "num_matches", m_nNumMatches); SetGenericShapeModelParam(m_tModelID, "max_overlap", m_nMaxOverlap); SetGenericShapeModelParam(m_tModelID, "timeout", m_nTimeOut); SetGenericShapeModelParam(m_tModelID, "greediness", m_nGreediness / 100.0); SetGenericShapeModelParam(m_tModelID, "border_shape_models", "false"); HTuple hv_MatchResultID, hv_NumMatchResult; HObject ho_MatchContour; FindGenericShapeModel(ho_TemplateImage, m_tModelID, &hv_MatchResultID, &hv_NumMatchResult); m_nNumber = hv_NumMatchResult.I(); for (int i = 0; i < hv_NumMatchResult.I(); i++) { HTuple hv_Row, hv_Column, hv_Angle, hv_Score; GetGenericShapeModelResultObject(&ho_MatchContour, hv_MatchResultID, i, "contours"); GetGenericShapeModelResult(hv_MatchResultID, i, "row", &hv_Row); GetGenericShapeModelResult(hv_MatchResultID, i, "column", &hv_Column); GetGenericShapeModelResult(hv_MatchResultID, i, "angle", &hv_Angle); GetGenericShapeModelResult(hv_MatchResultID, i, "score", &hv_Score); HObject ho_CrossContour; GenCrossContourXld(&ho_CrossContour, hv_Row, hv_Column, 80, hv_Angle); hwndUnit->ShowObj(ho_CrossContour, qRgb(255, 0, 0)); hwndUnit->ShowObj(ho_MatchContour, m_ObjColor); HTuple hv_Index = HTuple(i + 1) + " Score"; HTuple hv_Msg = "<" + hv_Score.TupleString(".2f") + ">"; hwndUnit->ShowMsg(hv_Index + hv_Msg, qRgb(0, 255, 0), (int)hv_Row.D(), (int)hv_Column.D()); TupleDeg(hv_Angle, &hv_Angle); m_Position.hv_Angle[i] = hv_Angle.TupleDeg(); m_Position.hv_Row[i] = HTuple(hv_Row); m_Position.hv_Column[i] = HTuple(hv_Column); } if (hv_NumMatchResult.I() > 0) { HTuple hv_Row, hv_Column, hv_Angle, hv_Score; GetGenericShapeModelResult(hv_MatchResultID, 0, "row", &hv_Row); GetGenericShapeModelResult(hv_MatchResultID, 0, "column", &hv_Column); GetGenericShapeModelResult(hv_MatchResultID, 0, "angle", &hv_Angle); HHomMat2D hv_HomMat2D; HTuple hv_Area, hv_Row4, hv_Column4; AreaCenter(m_objModelROI, &hv_Area, &hv_Row4, &hv_Column4); hv_HomMat2D.VectorAngleToRigid(HTuple(hv_Row), HTuple(hv_Column), HTuple(hv_Angle), hv_Row4, hv_Column4, HTuple(0)); m_AffineTransImage = m_Image.AffineTransImage(hv_HomMat2D, "constant", "false"); } // 排序 // bool m_bSortMode = false; // if (hv_Score.TupleLength() > 0) // { // HObject ho_Cross, ho_SortedRegions; // HTuple hv_Radius; // GenCrossContourXld(&ho_Cross, hv_Row, hv_Column, 1, 0); // SortContoursXld(ho_Cross, &ho_SortedRegions, "character", "true", m_bSortMode ? "column" : "row"); // SmallestCircleXld(ho_SortedRegions, &hv_Row, &hv_Column, &hv_Radius); // } // 显示定位到的区域 // for (HTuple hv_I = 0; hv_I.Continue((hv_Score.TupleLength()) - 1, 1); hv_I += 1) // { // // // // //HTuple hv_Angle; // //TupleDeg(hv_Angle[hv_I], &hv_Angle); // m_Position.hv_Angle[hv_I] = hv_Angle.TupleDeg()[hv_I]; // m_Position.hv_Row[hv_I] = HTuple(hv_Row[hv_I]); // m_Position.hv_Column[hv_I] = HTuple(hv_Column[hv_I]); // // //hv_Pos.hv_HomMat2D = m_Position.hv_HomMat2D.TupleConcat(hv_HomMat2D1); // // hwndUnit->ShowMsg(hv_I + 1, qRgb(255,0,0) , hv_Row[hv_I].D()+5, hv_Column[hv_I].D() +5, 50); // } if (((m_nNumMatches == hv_NumMatchResult.TupleLength().D()) || m_nNumMatches == 0) && (hv_NumMatchResult.TupleLength() != 0)) { m_nStatus = 1; // ok } else { m_nStatus = 2; // ok } } else { hwndUnit->ShowMsg("Error ",qRgb(255,0,0 ) ); hwndUnit->Refresh(true); emit sigUpdateUI(); return VPEnum::RETURN_VALUE::Error; } hwndUnit->Refresh(true); } catch (HException& exception) { char m_szMsg[2048] = ""; snprintf(m_szMsg, sizeof(m_szMsg), "Error #%u in %s: %s", exception.ErrorCode(), exception.ProcName().TextA(), exception.ErrorMessage().TextA()); qWarning() << m_szMsg; hwndUnit->Refresh(true); emit sigUpdateUI(); return VPEnum::RETURN_VALUE::Error; } catch (...) { qWarning() << "Execute() Error"; } emit sigUpdateUI(); return VPEnum::RETURN_VALUE::Success; } void ToolDialogImpl::on_ROIChange(const ViewMessage& sign) { switch (sign) { case ViewMessage::MovingROI: { }break; case ViewMessage::UpdateROI: { ROI* roi = m_RoiController.getActiveROI(); hv_roiDate = roi->getROIData(); try { GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]); Execute(); } catch (...) { } }break; case ViewMessage::CreatedROI: { m_RoiController.defineModelROI(); ROI* roi = m_RoiController.getActiveROI(); hv_roiDate = roi->getROIData(); try { GenRectangle1(&m_objROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]); } catch (...) { } } break; default: break; } } void ToolDialogImpl::Running(bool bRun) { } void ToolDialogImpl::timerEvent(QTimerEvent* event) { } bool ToolDialogImpl::Serialized(QDataStream& ar, bool bIsOut) { int paranum;//参数数量 if (bIsOut)//保存参数流程 { paranum = 12; ar << paranum;//先保存参数数量 ar << (int)1 << hv_roiDate; ar << (int)2 << m_Image; ar << (int)3 << m_RoiController; ar << (int)4 << m_objROI; ar << (int)5 << m_ObjColor; ar << (int)6 << m_objModelROI; ar << (int)7 << m_tModelID; ar << (int)8 << ui.spinBox_MinScore->value(); ar << (int)9 << ui.spinBox_TimeOut->value(); ar << (int)10 << ui.spinBox_MaxOverlap->value(); ar << (int)11 << ui.spinBox_NumMatches->value(); ar << (int)12 << ui.spinBox_Greediness->value(); } else//加载参数流程,参数加载顺序一定要跟保存顺序一致 { int nSize1 = 0; int para; ar >> paranum;//读取参数数量 for (int i = 0; i < paranum; i++) { ar >> para; switch (para) { case 1: ar >> hv_roiDate; break; case 2: ar >> m_Image; break; case 3: ar >> m_RoiController; break; case 4: ar >> m_objROI; break; case 5: ar >> m_ObjColor; break; case 6: ar >> m_objModelROI; break; case 7: ar >> m_tModelID; break; case 8: ar >> m_nMinScore; break; case 9: ar >> m_nTimeOut; break; case 10: ar >> m_nMaxOverlap; break; case 11: ar >> m_nNumMatches; break; case 12: ar >> m_nGreediness; break; default: { qWarning() << "Serialized(In) Error" ; return false; } break; } } ui.spinBox_MinScore->setValue(m_nMinScore); ui.spinBox_TimeOut->setValue(m_nTimeOut); ui.spinBox_MaxOverlap->setValue(m_nMaxOverlap); ui.spinBox_NumMatches->setValue(m_nNumMatches); ui.spinBox_Greediness->setValue(m_nGreediness); } return true; } void ToolDialogImpl::initValue() { m_nStatus = 0; m_nAngleStart = 0; m_nAngleExtent = 360; m_fScaleRMin = 1.0; m_fScaleRMax = 1.0; m_nGreediness = 0; m_nMinScore = 80; m_nTimeOut = 500; m_nMaxOverlap = 0; m_nNumMatches = 1; m_tModelID = -1; // 设置默认Tab页面 ui.tabWidget->setCurrentIndex(0); ui.spinBox_MinScore->setValue(m_nMinScore); ui.spinBox_TimeOut->setValue(m_nTimeOut); ui.spinBox_MaxOverlap->setValue(m_nMaxOverlap); ui.spinBox_NumMatches->setValue(m_nNumMatches); ui.spinBox_Greediness->setValue(m_nGreediness); m_ObjColor = qRgb(199, 21, 133); } void ToolDialogImpl::on_UpdateUI() { } /// /// 确定 /// void ToolDialogImpl::on_btnOK_clicked() { this->hide(); } /// /// 取消按钮 /// void ToolDialogImpl::on_btnCancel_clicked() { // 将本工具的恢复到打开工具之前的状态 RecoverData(); } /// /// 测试按钮 /// void ToolDialogImpl::on_btnExecute_clicked() { QElapsedTimer toolTimer; toolTimer.start(); // 发送事件 ToolEvent* pToolEvent = new ToolEvent(m_strPouName, m_strInstanceName, TOOL_EVENT_TYPE::TOOL_TRIGGER); QCoreApplication::sendEvent(m_pEventTarget, pToolEvent); // 统计返回值 VPEnum::RETURN_VALUE ret = pToolEvent->ret; double nExecTime = toolTimer.elapsed(); QString str; str = QString("耗时: %1 ms").arg(nExecTime, 0, 'G', 5); ui.label_time->setText(str); str = QString("状态: %1 ").arg(QMetaEnum::fromType().key((short)ret)); ui.label_state->setText(str); delete pToolEvent; } void ToolDialogImpl::on_btnCreateMoel_clicked() { DialogCreateModel dlg; dlg.m_Image = m_Image; dlg.m_objModelROI = m_objModelROI; dlg.m_objModelBrush = m_objModelBrush; dlg.m_hModelROIDate = m_hModelROIDate; dlg.m_hModelBrushDate = m_hModelBrushDate; dlg.m_objTransContours = m_objTransContours; dlg.m_nAngleStart = m_nAngleStart; dlg.m_nAngleExtent = m_nAngleExtent; dlg.m_fScaleRMin = m_fScaleRMin; dlg.m_fScaleRMax = m_fScaleRMax; dlg.UpdateData(false); int res = dlg.exec(); m_tModelID = dlg.m_tModelID; m_hvOriginRow = dlg.m_hvOriginRow; m_hvOriginColumn = dlg.m_hvOriginColumn; m_objModelROI = dlg.m_objModelROI; m_objModelBrush = dlg.m_objModelBrush; m_hModelROIDate = dlg.m_hModelROIDate; m_hModelBrushDate = dlg.m_hModelBrushDate; m_objTransContours = dlg.m_objTransContours; m_nAngleStart = dlg.m_nAngleStart; m_nAngleExtent = dlg.m_nAngleExtent; m_fScaleRMin = dlg.m_fScaleRMin; m_fScaleRMax = dlg.m_fScaleRMax; if (res != QDialog::Accepted) { return; } } void ToolDialogImpl::on_btnObjColor_clicked() { //m_ObjColor = QColorDialog::getColor(Qt::white, this, "设置定位对象的颜色" ); QColor color = QColorDialog::getColor(Qt::white, hwndUnit->parentWidget() ); // if (color.isValid()) // { // qDebug() << color.redF() << color.greenF() << color.blueF(); // } }