DialogCreateModel.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. #include "DialogCreateModel.h"
  2. DialogCreateModel::DialogCreateModel(QWidget *parent)
  3. : QDialog(parent)
  4. {
  5. ui.setupUi(this);
  6. setFixedSize(918, 543);
  7. ui.spin_AngleStart->setRange(-180, 180);
  8. ui.spin_AngleStart->setValue(0);
  9. ui.spin_AngleExtent->setRange(0, 360);
  10. ui.spin_AngleExtent->setValue(360);
  11. ui.spin_BrushSize->setValue(5);
  12. ui.spin_ScaleRMin->setSingleStep(0.1);
  13. ui.spin_ScaleRMin->setRange(0.5, 1.5);
  14. ui.spin_ScaleRMin->setValue(1.0);
  15. ui.spin_ScaleRMax->setSingleStep(0.1);
  16. ui.spin_ScaleRMax->setRange(0.5, 1.5);
  17. ui.spin_ScaleRMax->setValue(1.0);
  18. //////////////////////////////////////////////////////////////////////////
  19. // 显示控件初始化
  20. hwndUnit = new HWndUnit(this);
  21. Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
  22. m_pRoiController = new ROIController();
  23. hwndUnit->getHWndCtrl()->useROIController(m_pRoiController);
  24. connect(m_pRoiController, SIGNAL(ROIChange(const ViewMessage)), this, SLOT(on_ROIChange(const ViewMessage)));
  25. ROIRect1* pRoi = new ROIRect1();
  26. pRoi->setTitle("Model");
  27. m_pRoiController->setROISign(ROIOperation::Negative);
  28. m_pRoiController->setROIShape(pRoi);
  29. m_pRoiController->mouseDownAction(500, 500);
  30. ROIPoint* pRoiPoint = new ROIPoint();
  31. pRoiPoint->setTitle("Brush");
  32. pRoiPoint->setHandleWidth(100);
  33. //m_pRoiController->setROISign(ROIOperation::Negative);
  34. m_pRoiController->setROIShape(pRoiPoint);
  35. m_pRoiController->mouseDownAction(500, 400);
  36. //////////////////////////////////////////////////////////////////////////
  37. m_objModelBrush.GenEmptyObj();
  38. }
  39. DialogCreateModel::~DialogCreateModel()
  40. {
  41. }
  42. void DialogCreateModel::UpdateData(bool bUiToVar)
  43. {
  44. if (bUiToVar)
  45. {
  46. m_nAngleStart = ui.spin_AngleStart->value();
  47. m_nAngleExtent = ui.spin_AngleExtent->value();
  48. m_fScaleRMin = ui.spin_ScaleRMin->value();
  49. m_fScaleRMax = ui.spin_ScaleRMax->value();
  50. }
  51. else
  52. {
  53. // ROI
  54. for (int i = 0 ; i < m_pRoiController->ROIList.size();i++ )
  55. {
  56. m_pRoiController->setActiveROIidx(i);
  57. // if (m_pRoiController->getActiveROI()->getTitle() == "Model")
  58. // {
  59. // m_pRoiController->getActiveROI()->setROIData(m_hModelROIDate);
  60. // }
  61. if (m_pRoiController->getActiveROI()->getTitle() == "Brush")
  62. {
  63. m_pRoiController->getActiveROI()->setROIData(m_hModelBrushDate);
  64. }
  65. else
  66. {
  67. m_pRoiController->getActiveROI()->setROIData(m_hModelROIDate);
  68. }
  69. }
  70. ///
  71. ui.spin_AngleStart->setValue(m_nAngleStart);
  72. ui.spin_AngleExtent->setValue(m_nAngleExtent);
  73. ui.spin_ScaleRMin->setValue(m_fScaleRMin);
  74. ui.spin_ScaleRMax->setValue(m_fScaleRMax);
  75. }
  76. }
  77. void DialogCreateModel::showEvent(QShowEvent* event)
  78. {
  79. try
  80. {
  81. if (m_Image.IsInitialized())
  82. {
  83. hwndUnit->ShowImage(m_Image);
  84. hwndUnit->ShowObj(m_objModelROI, qRgb(0, 255, 0));
  85. hwndUnit->ShowObj(m_objModelBrush, qRgb(0, 255, 0));
  86. hwndUnit->ShowObj(m_objTransContours, qRgb(255, 25, 25));
  87. hwndUnit->Refresh(true);
  88. }
  89. }
  90. catch (...)
  91. {
  92. }
  93. }
  94. void DialogCreateModel::on_UpdateUI()
  95. {
  96. }
  97. /// <summary>
  98. /// 确定
  99. /// </summary>
  100. void DialogCreateModel::on_btnOK_clicked()
  101. {
  102. UpdateData();
  103. this->close();
  104. }
  105. /// <summary>
  106. /// 取消按钮
  107. /// </summary>
  108. void DialogCreateModel::on_btnCancel_clicked()
  109. {
  110. // 将本工具的恢复到打开工具之前的状态
  111. this->close();
  112. }
  113. /// <summary>
  114. ///
  115. /// </summary>
  116. /// <param name="sign"></param>
  117. void DialogCreateModel::on_ROIChange(const ViewMessage& sign)
  118. {
  119. hwndUnit->ShowImage(m_Image);
  120. switch (sign)
  121. {
  122. case ViewMessage::MovingROI:
  123. {
  124. ROI* roi = m_pRoiController->getActiveROI();
  125. hv_roiDate = roi->getROIData();
  126. if (roi->getTitle() == "Brush")
  127. {
  128. m_hModelBrushDate = hv_roiDate;
  129. HObject ho_Intersection;
  130. ho_Intersection.GenEmptyObj() ;
  131. int nBrushSize = ui.spin_BrushSize->value();
  132. HObject hv_Brush;
  133. GenRectangle2(&hv_Brush, hv_roiDate[0], hv_roiDate[1], 0, nBrushSize , nBrushSize);
  134. Intersection(m_objModelROI, hv_Brush, &ho_Intersection);
  135. HTuple hv_Area, hv_Row, hv_Column;
  136. AreaCenter(ho_Intersection, &hv_Area, &hv_Row, &hv_Column);
  137. if (hv_Area.D() > 1)
  138. {
  139. Union2(m_objModelBrush, hv_Brush, &m_objModelBrush);
  140. Difference(m_objModelROI, m_objModelBrush, &m_objModelROI);
  141. }
  142. hwndUnit->ShowObj(m_objModelROI, QColor(0, 255, 0));
  143. hwndUnit->ShowObj(m_objModelBrush, QColor(0, 255, 0));
  144. hwndUnit->ShowObj(m_objTransContours, QColor(255, 25, 25));
  145. }
  146. else
  147. {
  148. m_objModelBrush.GenEmptyObj();
  149. GenRectangle1(&m_objModelROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  150. m_hModelROIDate = hv_roiDate;
  151. }
  152. hwndUnit->Refresh(true);
  153. }break;
  154. case ViewMessage::UpdateROI:
  155. {
  156. CreateShapeModel();
  157. }break;
  158. case ViewMessage::CreatedROI:
  159. {
  160. m_pRoiController->defineModelROI();
  161. ROI* roi = m_pRoiController->getActiveROI();
  162. hv_roiDate = roi->getROIData();
  163. try
  164. {
  165. GenRectangle1(&m_objModelROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
  166. m_hModelROIDate = hv_roiDate;
  167. }
  168. catch (...)
  169. {
  170. }
  171. }
  172. break;
  173. default:
  174. break;
  175. }
  176. }
  177. void DialogCreateModel::CreateShapeModel()
  178. {
  179. try
  180. {
  181. hwndUnit->ShowImage(m_Image);
  182. hwndUnit->ShowObj(m_objModelROI, QColor(0, 255, 0));
  183. hwndUnit->ShowObj(m_objModelBrush, QColor(0, 255, 0));
  184. HObject ho_lateImage;
  185. ReduceDomain(m_Image, m_objModelROI, &ho_lateImage);
  186. m_nAngleStart = ui.spin_AngleStart->value();
  187. m_nAngleExtent = ui.spin_AngleExtent->value();
  188. m_fScaleRMin = ui.spin_ScaleRMin->value();
  189. m_fScaleRMax = ui.spin_ScaleRMax->value();
  190. //////////////////////////////////////////////////////////////////////////
  191. //Matching 01: Create and train the shape model
  192. CreateGenericShapeModel(&m_tModelID);
  193. //Matching 01: set the model parameters
  194. SetGenericShapeModelParam(m_tModelID, "iso_scale_max", 1.1);
  195. SetGenericShapeModelParam(m_tModelID, "iso_scale_min", 0.9);
  196. SetGenericShapeModelParam(m_tModelID, "metric", "use_polarity");
  197. TrainGenericShapeModel(ho_lateImage, m_tModelID);
  198. //////////////////////////////////////////////////////////////////////////
  199. HObject ho_ModelContours;
  200. HTuple hv_ModelRegionArea;
  201. GetShapeModelContours(&ho_ModelContours, m_tModelID, 1);
  202. //
  203. //Matching 01: Get the reference position
  204. AreaCenter(m_objModelROI, &hv_ModelRegionArea, &m_hvOriginRow, &m_hvOriginColumn);
  205. VectorAngleToRigid(0, 0, 0, m_hvOriginRow, m_hvOriginColumn, 0, &m_hvHomMat2D);
  206. AffineTransContourXld(ho_ModelContours, &m_objTransContours, m_hvHomMat2D);
  207. HObject ho_Cross;
  208. GenCrossContourXld(&ho_Cross, m_hvOriginRow, m_hvOriginColumn, 80, 0);
  209. hwndUnit->ShowObj(ho_Cross, QColor(255, 0, 0));
  210. hwndUnit->ShowObj(m_objTransContours, QColor(255, 25, 25));
  211. hwndUnit->Refresh(true);
  212. }
  213. catch (...)
  214. {
  215. //qWarning() << "CreateScaledShapeModel Error";
  216. hwndUnit->ShowMsg("CreateScaledShapeModel Error");
  217. }
  218. }