You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

577 lines
16 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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;
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<QGraphicsItem *> items = m_pRoiScene->items();
QList<GraphicsItem *> temp;
int nSize = items.size();
for (int i = 0; i < nSize; i++)
{
GraphicsItem *item = qgraphicsitem_cast<GraphicsItem*>(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<QGraphicsItem *> items = m_pRoiScene->items();
QList<GraphicsItem *> temp;
int nSize = items.size();
for (int i = 0; i < nSize; i++)
{
GraphicsItem *item = qgraphicsitem_cast<GraphicsItem*>(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<QGraphicsItem *> items = m_pTaskScene->items();
//GraphicsItem *item1;
//GraphicsItem *item2;
//int nSize = items.size();
//for (int i = 0; i < nSize; i++)
//{
// GraphicsItem *item = qgraphicsitem_cast<GraphicsItem*>(items.at(i));
// if (item && item->GetType() == GraphicsRect)
// {
//
// item1 = item;
// }
// if (item && item->GetType() == GraphicsCircle)
// {
// item2 = item;
// }
//}
//QList<QGraphicsItem *> 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<QGraphicsItem *> 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);
}