#include "DialogCreateModel.h"
DialogCreateModel::DialogCreateModel(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
setFixedSize(918, 543);
ui.spin_AngleStart->setRange(-180, 180);
ui.spin_AngleStart->setValue(0);
ui.spin_AngleExtent->setRange(0, 360);
ui.spin_AngleExtent->setValue(360);
ui.spin_BrushSize->setValue(5);
ui.spin_ScaleRMin->setSingleStep(0.1);
ui.spin_ScaleRMin->setRange(0.5, 1.5);
ui.spin_ScaleRMin->setValue(1.0);
ui.spin_ScaleRMax->setSingleStep(0.1);
ui.spin_ScaleRMax->setRange(0.5, 1.5);
ui.spin_ScaleRMax->setValue(1.0);
//////////////////////////////////////////////////////////////////////////
// 显示控件初始化
hwndUnit = new HWndUnit(this);
Util::ShowUnitInWidget(ui.Image_widget, hwndUnit);
m_pRoiController = new ROIController();
hwndUnit->getHWndCtrl()->useROIController(m_pRoiController);
connect(m_pRoiController, SIGNAL(ROIChange(const ViewMessage)), this, SLOT(on_ROIChange(const ViewMessage)));
ROIRect1* pRoi = new ROIRect1();
pRoi->setTitle("Model");
m_pRoiController->setROISign(ROIOperation::Negative);
m_pRoiController->setROIShape(pRoi);
m_pRoiController->mouseDownAction(500, 500);
ROIPoint* pRoiPoint = new ROIPoint();
pRoiPoint->setTitle("Brush");
pRoiPoint->setHandleWidth(100);
//m_pRoiController->setROISign(ROIOperation::Negative);
m_pRoiController->setROIShape(pRoiPoint);
m_pRoiController->mouseDownAction(500, 400);
//////////////////////////////////////////////////////////////////////////
m_objModelBrush.GenEmptyObj();
}
DialogCreateModel::~DialogCreateModel()
{
}
void DialogCreateModel::UpdateData(bool bUiToVar)
{
if (bUiToVar)
{
m_nAngleStart = ui.spin_AngleStart->value();
m_nAngleExtent = ui.spin_AngleExtent->value();
m_fScaleRMin = ui.spin_ScaleRMin->value();
m_fScaleRMax = ui.spin_ScaleRMax->value();
}
else
{
// ROI
for (int i = 0 ; i < m_pRoiController->ROIList.size();i++ )
{
m_pRoiController->setActiveROIidx(i);
// if (m_pRoiController->getActiveROI()->getTitle() == "Model")
// {
// m_pRoiController->getActiveROI()->setROIData(m_hModelROIDate);
// }
if (m_pRoiController->getActiveROI()->getTitle() == "Brush")
{
m_pRoiController->getActiveROI()->setROIData(m_hModelBrushDate);
}
else
{
m_pRoiController->getActiveROI()->setROIData(m_hModelROIDate);
}
}
///
ui.spin_AngleStart->setValue(m_nAngleStart);
ui.spin_AngleExtent->setValue(m_nAngleExtent);
ui.spin_ScaleRMin->setValue(m_fScaleRMin);
ui.spin_ScaleRMax->setValue(m_fScaleRMax);
}
}
void DialogCreateModel::showEvent(QShowEvent* event)
{
try
{
if (m_Image.IsInitialized())
{
hwndUnit->ShowImage(m_Image);
hwndUnit->ShowObj(m_objModelROI, qRgb(0, 255, 0));
hwndUnit->ShowObj(m_objModelBrush, qRgb(0, 255, 0));
hwndUnit->ShowObj(m_objTransContours, qRgb(255, 25, 25));
hwndUnit->Refresh(true);
}
}
catch (...)
{
}
}
void DialogCreateModel::on_UpdateUI()
{
}
///
/// 确定
///
void DialogCreateModel::on_btnOK_clicked()
{
UpdateData();
this->close();
}
///
/// 取消按钮
///
void DialogCreateModel::on_btnCancel_clicked()
{
// 将本工具的恢复到打开工具之前的状态
this->close();
}
///
///
///
///
void DialogCreateModel::on_ROIChange(const ViewMessage& sign)
{
hwndUnit->ShowImage(m_Image);
switch (sign)
{
case ViewMessage::MovingROI:
{
ROI* roi = m_pRoiController->getActiveROI();
hv_roiDate = roi->getROIData();
if (roi->getTitle() == "Brush")
{
m_hModelBrushDate = hv_roiDate;
HObject ho_Intersection;
ho_Intersection.GenEmptyObj() ;
int nBrushSize = ui.spin_BrushSize->value();
HObject hv_Brush;
GenRectangle2(&hv_Brush, hv_roiDate[0], hv_roiDate[1], 0, nBrushSize , nBrushSize);
Intersection(m_objModelROI, hv_Brush, &ho_Intersection);
HTuple hv_Area, hv_Row, hv_Column;
AreaCenter(ho_Intersection, &hv_Area, &hv_Row, &hv_Column);
if (hv_Area.D() > 1)
{
Union2(m_objModelBrush, hv_Brush, &m_objModelBrush);
Difference(m_objModelROI, m_objModelBrush, &m_objModelROI);
}
hwndUnit->ShowObj(m_objModelROI, QColor(0, 255, 0));
hwndUnit->ShowObj(m_objModelBrush, QColor(0, 255, 0));
hwndUnit->ShowObj(m_objTransContours, QColor(255, 25, 25));
}
else
{
m_objModelBrush.GenEmptyObj();
GenRectangle1(&m_objModelROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
m_hModelROIDate = hv_roiDate;
}
hwndUnit->Refresh(true);
}break;
case ViewMessage::UpdateROI:
{
CreateShapeModel();
}break;
case ViewMessage::CreatedROI:
{
m_pRoiController->defineModelROI();
ROI* roi = m_pRoiController->getActiveROI();
hv_roiDate = roi->getROIData();
try
{
GenRectangle1(&m_objModelROI, hv_roiDate[0], hv_roiDate[1], hv_roiDate[2], hv_roiDate[3]);
m_hModelROIDate = hv_roiDate;
}
catch (...)
{
}
}
break;
default:
break;
}
}
void DialogCreateModel::CreateShapeModel()
{
try
{
hwndUnit->ShowImage(m_Image);
hwndUnit->ShowObj(m_objModelROI, QColor(0, 255, 0));
hwndUnit->ShowObj(m_objModelBrush, QColor(0, 255, 0));
HObject ho_lateImage;
ReduceDomain(m_Image, m_objModelROI, &ho_lateImage);
m_nAngleStart = ui.spin_AngleStart->value();
m_nAngleExtent = ui.spin_AngleExtent->value();
m_fScaleRMin = ui.spin_ScaleRMin->value();
m_fScaleRMax = ui.spin_ScaleRMax->value();
//////////////////////////////////////////////////////////////////////////
//Matching 01: Create and train the shape model
CreateGenericShapeModel(&m_tModelID);
//Matching 01: set the model parameters
SetGenericShapeModelParam(m_tModelID, "iso_scale_max", 1.1);
SetGenericShapeModelParam(m_tModelID, "iso_scale_min", 0.9);
SetGenericShapeModelParam(m_tModelID, "metric", "use_polarity");
TrainGenericShapeModel(ho_lateImage, m_tModelID);
//////////////////////////////////////////////////////////////////////////
HObject ho_ModelContours;
HTuple hv_ModelRegionArea;
GetShapeModelContours(&ho_ModelContours, m_tModelID, 1);
//
//Matching 01: Get the reference position
AreaCenter(m_objModelROI, &hv_ModelRegionArea, &m_hvOriginRow, &m_hvOriginColumn);
VectorAngleToRigid(0, 0, 0, m_hvOriginRow, m_hvOriginColumn, 0, &m_hvHomMat2D);
AffineTransContourXld(ho_ModelContours, &m_objTransContours, m_hvHomMat2D);
HObject ho_Cross;
GenCrossContourXld(&ho_Cross, m_hvOriginRow, m_hvOriginColumn, 80, 0);
hwndUnit->ShowObj(ho_Cross, QColor(255, 0, 0));
hwndUnit->ShowObj(m_objTransContours, QColor(255, 25, 25));
hwndUnit->Refresh(true);
}
catch (...)
{
//qWarning() << "CreateScaledShapeModel Error";
hwndUnit->ShowMsg("CreateScaledShapeModel Error");
}
}