添加项目文件。

This commit is contained in:
keyeslll
2023-02-28 14:50:28 +08:00
commit e20fa428dd
187 changed files with 18135 additions and 0 deletions

View File

@ -0,0 +1,97 @@
#include "ImageLoaderModel.hpp"
#include <QtCore/QEvent>
#include <QtCore/QDir>
#include <QtWidgets/QFileDialog>
ImageLoaderModel::
ImageLoaderModel()
: _label(new QLabel(QStringLiteral("点击加载图片!")))
{
//_label->setAlignment(Qt::AlignHCenter);
QFont f = _label->font();
f.setBold(true);
f.setItalic(true);
_label->setFont(f);
_label->setFixedSize(200, 200);
_label->installEventFilter(this);
}
unsigned int
ImageLoaderModel::
nPorts(PortType portType) const
{
unsigned int result = 1;
switch (portType)
{
case PortType::In:
result = 0;
break;
case PortType::Out:
result = 1;
default:
break;
}
return result;
}
bool
ImageLoaderModel::
eventFilter(QObject* object, QEvent* event)
{
if (object == _label)
{
int w = _label->width();
int h = _label->height();
if (event->type() == QEvent::MouseButtonPress)
{
QString fileName =
QFileDialog::getOpenFileName(nullptr,
tr("Open Image"),
QDir::homePath(),
tr("Image Files (*.png *.jpg *.bmp)"));
_pixmap = QPixmap(fileName);
_label->setPixmap(_pixmap.scaled(w, h, Qt::KeepAspectRatio));
Q_EMIT dataUpdated(0);
return true;
}
else if (event->type() == QEvent::Resize)
{
if (!_pixmap.isNull())
_label->setPixmap(_pixmap.scaled(w, h, Qt::KeepAspectRatio));
}
}
return false;
}
NodeDataType
ImageLoaderModel::
dataType(PortType, PortIndex) const
{
return PixmapData().type();
}
std::shared_ptr<NodeData>
ImageLoaderModel::
outData(PortIndex)
{
return std::make_shared<PixmapData>(_pixmap);
}

View File

@ -0,0 +1,80 @@
#pragma once
#include <iostream>
#include <QtCore/QObject>
#include <QtWidgets/QLabel>
#include "DataModelRegistry.hpp"
#include "NodeDataModel.hpp"
#include "PixmapData.hpp"
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
/// The model dictates the number of inputs and outputs for the Node.
/// In this example it has no logic.
class ImageLoaderModel : public NodeDataModel
{
Q_OBJECT
public:
ImageLoaderModel();
virtual
~ImageLoaderModel() {}
public:
QString
caption() const override
{
return QStringLiteral("QPixmap输入");
}
QString
name() const override { return QStringLiteral("QPixmap输入"); }
public:
virtual QString
modelName() const
{
return QStringLiteral("QPixmap输入");
}
unsigned int
nPorts(PortType portType) const override;
NodeDataType
dataType(PortType portType, PortIndex portIndex) const override;
std::shared_ptr<NodeData>
outData(PortIndex port) override;
void
setInData(std::shared_ptr<NodeData>, int) override
{ }
QWidget*
embeddedWidget() override { return _label; }
bool
resizable() const override { return true; }
protected:
bool
eventFilter(QObject* object, QEvent* event) override;
private:
QLabel* _label;
QPixmap _pixmap;
};

View File

@ -0,0 +1,110 @@
#include "ImageShowModel.hpp"
#include <QtCore/QEvent>
#include <QtCore/QDir>
#include <QtWidgets/QFileDialog>
#include "DataModelRegistry.hpp"
#include "PixmapData.hpp"
ImageShowModel::
ImageShowModel()
: _label(new QLabel("Image will appear here"))
{
_label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
QFont f = _label->font();
f.setBold(true);
f.setItalic(true);
_label->setFont(f);
_label->setFixedSize(200, 200);
_label->installEventFilter(this);
}
unsigned int
ImageShowModel::
nPorts(PortType portType) const
{
unsigned int result = 1;
switch (portType)
{
case PortType::In:
result = 1;
break;
case PortType::Out:
result = 1;
default:
break;
}
return result;
}
bool
ImageShowModel::
eventFilter(QObject* object, QEvent* event)
{
if (object == _label)
{
int w = _label->width();
int h = _label->height();
if (event->type() == QEvent::Resize)
{
auto d = std::dynamic_pointer_cast<PixmapData>(_nodeData);
if (d)
{
_label->setPixmap(d->pixmap().scaled(w, h, Qt::KeepAspectRatio));
}
}
}
return false;
}
NodeDataType
ImageShowModel::
dataType(PortType, PortIndex) const
{
return PixmapData().type();
}
std::shared_ptr<NodeData>
ImageShowModel::
outData(PortIndex)
{
return _nodeData;
}
void
ImageShowModel::
setInData(std::shared_ptr<NodeData> nodeData, PortIndex)
{
_nodeData = nodeData;
if (_nodeData)
{
auto d = std::dynamic_pointer_cast<PixmapData>(_nodeData);
int w = _label->width();
int h = _label->height();
_label->setPixmap(d->pixmap().scaled(w, h, Qt::KeepAspectRatio));
}
else
{
_label->setPixmap(QPixmap());
}
Q_EMIT dataUpdated(0);
}

View File

@ -0,0 +1,80 @@
#pragma once
#include <iostream>
#include <QtCore/QObject>
#include <QtWidgets/QLabel>
#include "DataModelRegistry.hpp"
#include "NodeDataModel.hpp"
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
/// The model dictates the number of inputs and outputs for the Node.
/// In this example it has no logic.
class ImageShowModel : public NodeDataModel
{
Q_OBJECT
public:
ImageShowModel();
virtual
~ImageShowModel() {}
public:
QString
caption() const override
{
return QStringLiteral("QPixmap 显示");
}
QString
name() const override
{
return QStringLiteral("QPixmap显示节点");
}
public:
virtual QString
modelName() const
{
return QStringLiteral("QPixmap显示");
}
unsigned int
nPorts(PortType portType) const override;
NodeDataType
dataType(PortType portType, PortIndex portIndex) const override;
std::shared_ptr<NodeData>
outData(PortIndex port) override;
void
setInData(std::shared_ptr<NodeData> nodeData, PortIndex port) override;
QWidget*
embeddedWidget() override { return _label; }
bool
resizable() const override { return true; }
protected:
bool
eventFilter(QObject* object, QEvent* event) override;
private:
QLabel* _label;
std::shared_ptr<NodeData> _nodeData;
};

View File

@ -0,0 +1,35 @@
#pragma once
#include <QtGui/QPixmap>
#include "NodeDataModel.hpp"
using QtNodes::NodeData;
using QtNodes::NodeDataType;
/// The class can potentially incapsulate any user data which
/// need to be transferred within the Node Editor graph
class PixmapData : public NodeData
{
public:
PixmapData() {}
PixmapData(QPixmap const& pixmap)
: _pixmap(pixmap)
{}
NodeDataType
type() const override
{
// id name
return { "pixmap", "QPixmap" };
}
QPixmap
pixmap() const { return _pixmap; }
private:
QPixmap _pixmap{};
};

View File

@ -0,0 +1,55 @@
#include "VisionFlowWidget.hpp"
VisionFlowWidget::VisionFlowWidget(QWidget* parent)
{
main_layout = new QVBoxLayout();
header_layout = new QHBoxLayout();
btn_load_scheme = new QPushButton("Load");
btn_save_scheme = new QPushButton("Save");
btn_clear_scene = new QPushButton("Clear");
btn_test = new QPushButton("test");
header_layout->setAlignment(Qt::AlignLeft);
btn_load_scheme->setFixedWidth(120);
btn_save_scheme->setFixedWidth(120);
btn_clear_scene->setFixedWidth(120);
this->setLayout(main_layout);
main_layout->addLayout(header_layout);
header_layout->addWidget(btn_load_scheme);
header_layout->addWidget(btn_save_scheme);
header_layout->addWidget(btn_clear_scene);
header_layout->addWidget(btn_test);
header_layout->setContentsMargins(0, 0, 0, 0);
main_layout->setContentsMargins(1, 1, 1, 1);
main_layout->setSpacing(1);
m_scene = new FlowScene(registerDataModels());
m_view = new FlowView(m_scene);
main_layout->addWidget(m_view);
this->setWindowTitle(QStringLiteral("节点编辑器"));
this->resize(1280, 720);
setConnection();
}
VisionFlowWidget::~VisionFlowWidget()
{
}
void VisionFlowWidget::setConnection()
{
connect(btn_load_scheme, &QPushButton::clicked, [=]()
{
m_scene->load();
});
connect(btn_save_scheme, &QPushButton::clicked, [=]()
{
m_scene->save();
});
connect(btn_clear_scene, &QPushButton::clicked, [=]()
{
m_scene->clearScene();
});
connect(btn_test, &QPushButton::clicked, [=]()
{
DrawShapeView::getInst()->show();
});
}

View File

@ -0,0 +1,95 @@
#pragma once
#include "NodeData.hpp"
#include "FlowScene.hpp"
#include "FlowView.hpp"
#include <QString>
#include <QStringLiteral>
#include <QtWidgets/QApplication>
#include <QIcon>
#include <QImage>
#include "ImageShowModel.hpp"
#include "ImageLoaderModel.hpp"
#include "DrawShapeView.hpp"
#include "halcon/HalconNodes.hpp"
#include "calculator/MathNodes.hpp"
//#include "opcv/CvImageLoaderModel.h"
//#include "opcv/CvImageShowModel.h"
#include "opcv/MoudleOpencvNodes.h"
using QtNodes::DataModelRegistry;
using QtNodes::FlowScene;
using QtNodes::FlowView;
class VisionFlowWidget :public QWidget
{
public:
VisionFlowWidget(QWidget* parent = Q_NULLPTR);
virtual ~VisionFlowWidget();
private:
QVBoxLayout* main_layout;
QHBoxLayout* header_layout;
QPushButton* btn_load_scheme;
QPushButton* btn_save_scheme;
QPushButton* btn_clear_scene;
QPushButton* btn_test;
FlowScene* m_scene;
FlowView* m_view;
//DrawShapeView* m_draw_shape_view;
private:
void setConnection();
};
static std::shared_ptr<DataModelRegistry> registerDataModels()
{
QString numberNodeType = QStringLiteral("数学操作");
QString halconImageNodeType = QStringLiteral("Halcon图像操作");
QString getHalconImageNodeType = QStringLiteral("获取Halcon图像");
QString dlNodeType = QStringLiteral("深度学习");
QString matchNodeType = QStringLiteral("模板匹配");
QString getOpencvImageNodeType = QStringLiteral("00.获取OpenCV图像");
QString opencvImageNodeType = QStringLiteral("01.OpenCV图像操作");
auto ret = std::make_shared<DataModelRegistry>();
//opencv图像获取
ret->registerModel<CvImageLoaderModel>(getOpencvImageNodeType);
//opencv图像操作
ret->registerModel<CvImageShowModel>(opencvImageNodeType);
ret->registerModel<CvGraphicsShowModel>(opencvImageNodeType);
ret->registerModel<CvImageRGB2GrayModel>(opencvImageNodeType);
//数学节点
ret->registerModel<AdditionModel>(numberNodeType);
ret->registerModel<DivisionModel>(numberNodeType);
ret->registerModel<MultiplicationModel>(numberNodeType);
ret->registerModel<SubtractionModel>(numberNodeType);
ret->registerModel<NumberSourceDataModel>(numberNodeType);
ret->registerModel<NumberDisplayDataModel>(numberNodeType);
//图像获取
ret->registerModel<HImageLoaderModel>(getHalconImageNodeType);
//ret->registerModel<HImageFolderModel>(getHalconImageNodeType);
//图像操作
ret->registerModel<HImageShowModel>(halconImageNodeType);
ret->registerModel<HImageRGB2GrayModel>(halconImageNodeType);
ret->registerModel<HImageSplitChanelModel>(halconImageNodeType);
ret->registerModel<HImageThresholdModel>(halconImageNodeType);
//ret->registerModel<HRegionSelectModel>(halconImageNodeType);
ret->registerModel<HRegionConnectModel>(halconImageNodeType);
ret->registerModel<HRegionShapeTransModel>(halconImageNodeType);
ret->registerModel<HImageReduceDomainModel>(halconImageNodeType);
ret->registerModel<HRegionFillUpShapeModel>(halconImageNodeType);
ret->registerModel<HRegionOpenCircleModel>(halconImageNodeType);
ret->registerModel<HRegionUnionModel>(halconImageNodeType);
ret->registerModel<HRegionDifferenceModel>(halconImageNodeType);
ret->registerModel<HRegionSelectShapeStdModel>(halconImageNodeType);
ret->registerModel<HImageDLSegmentModel>(halconImageNodeType);
return ret;
}

View File

@ -0,0 +1,22 @@

#include <QtWidgets/QApplication>
#include <QtWidgets/QStyleFactory>
#include "VisionFlowWidget.hpp"
#include "QBreakpadHandler.h"
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
app.setWindowIcon(QIcon(":/logo.png"));
QStyle* style = QStyleFactory::create("Fusion");
app.setStyle(style);
VisionFlowWidget* mainWidget = new VisionFlowWidget();
mainWidget->show();
QBreakpadInstance.setDumpPath("crash");
return app.exec();
}