first commit
This commit is contained in:
commit
00cbe9b3b9
40
ImageLabelingTool.pro
Normal file
40
ImageLabelingTool.pro
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#-------------------------------------------------
|
||||||
|
#
|
||||||
|
# Project created by QtCreator 2018-10-23T15:07:41
|
||||||
|
#
|
||||||
|
#-------------------------------------------------
|
||||||
|
|
||||||
|
QT += core gui widgets
|
||||||
|
|
||||||
|
TARGET = ImageLabelingTool
|
||||||
|
TEMPLATE = app
|
||||||
|
|
||||||
|
# The following define makes your compiler emit warnings if you use
|
||||||
|
# any feature of Qt which has been marked as deprecated (the exact warnings
|
||||||
|
# depend on your compiler). Please consult the documentation of the
|
||||||
|
# deprecated API in order to know how to port your code away from it.
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
|
||||||
|
# You can also make your code fail to compile if you use deprecated APIs.
|
||||||
|
# In order to do so, uncomment the following line.
|
||||||
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
|
CONFIG += c++11
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
mainwindow.cpp \
|
||||||
|
label_img.cpp
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
mainwindow.h \
|
||||||
|
label_img.h
|
||||||
|
|
||||||
|
FORMS += \
|
||||||
|
mainwindow.ui
|
||||||
|
|
||||||
|
# Default rules for deployment.
|
||||||
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
|
else: unix:!android: target.path = /opt/$${TARGET}/bin
|
||||||
|
!isEmpty(target.path): INSTALLS += target
|
268
label_img.cpp
Normal file
268
label_img.cpp
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
#include "label_img.h"
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
using std::ifstream;
|
||||||
|
|
||||||
|
QColor label_img::BOX_COLORS[10] ={ Qt::green,
|
||||||
|
Qt::darkGreen,
|
||||||
|
Qt::blue,
|
||||||
|
Qt::darkBlue,
|
||||||
|
Qt::yellow,
|
||||||
|
Qt::darkYellow,
|
||||||
|
Qt::red,
|
||||||
|
Qt::darkRed,
|
||||||
|
Qt::cyan,
|
||||||
|
Qt::darkCyan};
|
||||||
|
|
||||||
|
label_img::label_img(QWidget *parent)
|
||||||
|
:QLabel(parent),
|
||||||
|
m_bMouseLeftButtonClicked(false),
|
||||||
|
m_focusedObjectLabel(0)
|
||||||
|
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::mouseMoveEvent(QMouseEvent *ev)
|
||||||
|
{
|
||||||
|
std::cout<< "moved"<< std::endl;
|
||||||
|
|
||||||
|
setMousePosition(ev->x(), ev->y());
|
||||||
|
|
||||||
|
showImage();
|
||||||
|
emit Mouse_Moved();
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::mousePressEvent(QMouseEvent *ev)
|
||||||
|
{
|
||||||
|
std::cout<< "clicked"<< std::endl;
|
||||||
|
|
||||||
|
setMousePosition(ev->x(), ev->y());
|
||||||
|
|
||||||
|
if(ev->button() == Qt::RightButton)
|
||||||
|
{
|
||||||
|
removeFocusedObjectBox(m_mouse_pos_in_image_coordinate);
|
||||||
|
showImage();
|
||||||
|
}
|
||||||
|
else if(ev->button() == Qt::LeftButton)
|
||||||
|
{
|
||||||
|
m_bMouseLeftButtonClicked = true;
|
||||||
|
m_objStartPoint = m_mouse_pos_in_image_coordinate;
|
||||||
|
}
|
||||||
|
|
||||||
|
emit Mouse_Pressed();
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::mouseReleaseEvent(QMouseEvent *ev)
|
||||||
|
{
|
||||||
|
std::cout<< "released"<< std::endl;
|
||||||
|
|
||||||
|
if(ev->button() == Qt::LeftButton)
|
||||||
|
{
|
||||||
|
m_bMouseLeftButtonClicked = false;
|
||||||
|
|
||||||
|
setMousePosition(ev->x(), ev->y());
|
||||||
|
m_objEndPoint = m_mouse_pos_in_image_coordinate;
|
||||||
|
|
||||||
|
ObjectLabelingBox objBoundingbox;
|
||||||
|
objBoundingbox.label = m_focusedObjectLabel;
|
||||||
|
objBoundingbox.box = getRectFromTwoPoints(m_objEndPoint, m_objStartPoint);
|
||||||
|
|
||||||
|
bool width_is_too_small = objBoundingbox.box.width() < m_inputImg.width() * 0.01;
|
||||||
|
bool height_is_too_small = objBoundingbox.box.height() < m_inputImg.height() * 0.01;
|
||||||
|
|
||||||
|
if(!width_is_too_small && !height_is_too_small)
|
||||||
|
{
|
||||||
|
m_objBoundingBoxes.push_back(objBoundingbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
showImage();
|
||||||
|
}
|
||||||
|
emit Mouse_Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::setMousePosition(int x, int y)
|
||||||
|
{
|
||||||
|
if(x < 0) x = 0;
|
||||||
|
if(y < 0) y = 0;
|
||||||
|
|
||||||
|
if(x > this->width()) x = this->width() - 1;
|
||||||
|
if(y > this->height()) y = this->height() - 1;
|
||||||
|
|
||||||
|
m_mouse_pos_in_ui_coordinate = QPoint(x, y);
|
||||||
|
m_mouse_pos_in_image_coordinate = QPoint(static_cast<int>(m_mouse_pos_in_ui_coordinate.x() * m_aspectRatioWidth),
|
||||||
|
static_cast<int>(m_mouse_pos_in_ui_coordinate.y() * m_aspectRatioHeight));
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::openImage(const QString &qstrImg)
|
||||||
|
{
|
||||||
|
m_inputImg = QImage(qstrImg);
|
||||||
|
m_inputImgCopy = m_inputImg;
|
||||||
|
|
||||||
|
m_aspectRatioWidth = static_cast<double>(m_inputImg.width()) / this->width();
|
||||||
|
m_aspectRatioHeight = static_cast<double>(m_inputImg.height()) / this->height();
|
||||||
|
|
||||||
|
m_objBoundingBoxes.clear();
|
||||||
|
|
||||||
|
m_objStartPoint = QPoint();
|
||||||
|
|
||||||
|
QPoint curMousePos = this->mapFromGlobal(QCursor::pos());
|
||||||
|
bool mouse_is_not_in_image = (curMousePos.x() < 0 || curMousePos.x() > this->width() - 1)
|
||||||
|
|| (curMousePos.y() < 0 || curMousePos.y() > this->height() - 1);
|
||||||
|
|
||||||
|
if (mouse_is_not_in_image)
|
||||||
|
{
|
||||||
|
m_objEndPoint = QPoint();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
setMousePosition(curMousePos.x(), curMousePos.y());
|
||||||
|
m_objEndPoint = m_mouse_pos_in_image_coordinate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::showImage()
|
||||||
|
{
|
||||||
|
if(m_inputImg.isNull()) return;
|
||||||
|
|
||||||
|
m_inputImg = m_inputImgCopy;
|
||||||
|
|
||||||
|
QPainter painter(&m_inputImg);
|
||||||
|
|
||||||
|
int penThick = (m_inputImg.width() + m_inputImg.height())/400;
|
||||||
|
|
||||||
|
QColor crossLineColor(255, 187, 0);
|
||||||
|
|
||||||
|
drawCrossLine(painter, crossLineColor, penThick);
|
||||||
|
drawFocusedObjectBox(painter, Qt::magenta, penThick);
|
||||||
|
drawObjectBoxes(painter, penThick);
|
||||||
|
|
||||||
|
this->setPixmap(QPixmap::fromImage(m_inputImg));
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::loadLabelData(const QString& labelFilePath)
|
||||||
|
{
|
||||||
|
ifstream inputFile(labelFilePath.toStdString());
|
||||||
|
|
||||||
|
if(inputFile.is_open()){
|
||||||
|
|
||||||
|
double inputFileValue;
|
||||||
|
QVector<double> inputFileValues;
|
||||||
|
|
||||||
|
while(inputFile >> inputFileValue)
|
||||||
|
inputFileValues.push_back(inputFileValue);
|
||||||
|
|
||||||
|
for(int i = 0; i < inputFileValues.size(); i += 5)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
ObjectLabelingBox objBox;
|
||||||
|
objBox.label = static_cast<int>(inputFileValues[i]);
|
||||||
|
|
||||||
|
double midX = inputFileValues.at(i + 1) * m_inputImg.width();
|
||||||
|
double midY = inputFileValues.at(i + 2) * m_inputImg.height();
|
||||||
|
double width = inputFileValues.at(i + 3) * m_inputImg.width();
|
||||||
|
double height = inputFileValues.at(i + 4) * m_inputImg.height();
|
||||||
|
|
||||||
|
objBox.box.setX(static_cast<int>(midX - width/2));
|
||||||
|
objBox.box.setY(static_cast<int>(midY - height/2));
|
||||||
|
objBox.box.setWidth(static_cast<int>(width));
|
||||||
|
objBox.box.setHeight(static_cast<int>(height));
|
||||||
|
|
||||||
|
m_objBoundingBoxes.push_back(objBox);
|
||||||
|
}
|
||||||
|
catch (const std::out_of_range& e) {
|
||||||
|
std::cout << "loadLabelData: Out of Range error.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::setFocusObjectLabel(int nLabel)
|
||||||
|
{
|
||||||
|
m_focusedObjectLabel = nLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::setFocusObjectName(QString qstrName)
|
||||||
|
{
|
||||||
|
m_foucsedObjectName = qstrName;
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::drawCrossLine(QPainter& painter, QColor color, int thickWidth)
|
||||||
|
{
|
||||||
|
if(m_objEndPoint == QPoint()) return;
|
||||||
|
|
||||||
|
QPen pen;
|
||||||
|
pen.setWidth(thickWidth);
|
||||||
|
|
||||||
|
pen.setColor(color);
|
||||||
|
painter.setPen(pen);
|
||||||
|
|
||||||
|
//draw cross line
|
||||||
|
painter.drawLine(QPoint(m_mouse_pos_in_image_coordinate.x(),0), QPoint(m_mouse_pos_in_image_coordinate.x(),m_inputImg.height() - 1));
|
||||||
|
painter.drawLine(QPoint(0,m_mouse_pos_in_image_coordinate.y()), QPoint(m_inputImg.width() - 1, m_mouse_pos_in_image_coordinate.y()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::drawFocusedObjectBox(QPainter& painter, Qt::GlobalColor color, int thickWidth)
|
||||||
|
{
|
||||||
|
if(m_bMouseLeftButtonClicked)
|
||||||
|
{
|
||||||
|
QPen pen;
|
||||||
|
pen.setWidth(thickWidth);
|
||||||
|
|
||||||
|
pen.setColor(color);
|
||||||
|
painter.setPen(pen);
|
||||||
|
painter.drawRect(QRect(m_objStartPoint, m_mouse_pos_in_image_coordinate));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::drawObjectBoxes(QPainter& painter, int thickWidth)
|
||||||
|
{
|
||||||
|
QPen pen;
|
||||||
|
pen.setWidth(thickWidth);
|
||||||
|
|
||||||
|
for(ObjectLabelingBox boundingbox: m_objBoundingBoxes)
|
||||||
|
{
|
||||||
|
pen.setColor(m_drawObjectBoxColor.at(boundingbox.label));
|
||||||
|
painter.setPen(pen);
|
||||||
|
|
||||||
|
painter.drawRect(boundingbox.box);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void label_img::removeFocusedObjectBox(QPoint point)
|
||||||
|
{
|
||||||
|
int removeBoxIdx = -1;
|
||||||
|
double nearestBoxDistance = 99999999999999.;
|
||||||
|
|
||||||
|
for(int i = 0; i < m_objBoundingBoxes.size(); i++)
|
||||||
|
{
|
||||||
|
QRect objBox = m_objBoundingBoxes.at(i).box;
|
||||||
|
|
||||||
|
if(objBox.contains(point))
|
||||||
|
{
|
||||||
|
double distance = sqrt(pow(objBox.center().x() - point.x(), 2)+ pow(objBox.center().y() - point.y(), 2));
|
||||||
|
if(distance < nearestBoxDistance)
|
||||||
|
{
|
||||||
|
nearestBoxDistance = distance;
|
||||||
|
removeBoxIdx = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(removeBoxIdx != -1)
|
||||||
|
{
|
||||||
|
m_objBoundingBoxes.remove(removeBoxIdx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRect label_img::getRectFromTwoPoints(QPoint p1, QPoint p2)
|
||||||
|
{
|
||||||
|
int midX = (p1.x() + p2.x()) / 2;
|
||||||
|
int midY = (p1.y() + p2.y()) / 2;
|
||||||
|
int width = abs(p1.x() - p2.x());
|
||||||
|
int height = abs(p1.y() - p2.y());
|
||||||
|
|
||||||
|
QPoint topLeftPoint(midX - width/2, midY - height/2);
|
||||||
|
QPoint bottomRightPoint(midX + width/2, midY + height/2);
|
||||||
|
|
||||||
|
return QRect(topLeftPoint, bottomRightPoint);
|
||||||
|
}
|
83
label_img.h
Normal file
83
label_img.h
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
#ifndef LABEL_IMG_H
|
||||||
|
#define LABEL_IMG_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QImage>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
struct ObjectLabelingBox
|
||||||
|
{
|
||||||
|
int label;
|
||||||
|
QRect box;
|
||||||
|
};
|
||||||
|
|
||||||
|
class label_img : public QLabel
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
label_img(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
void mouseMoveEvent(QMouseEvent *ev);
|
||||||
|
void mousePressEvent(QMouseEvent *ev);
|
||||||
|
void mouseReleaseEvent(QMouseEvent *ev);
|
||||||
|
|
||||||
|
QImage m_inputImg;
|
||||||
|
QImage m_inputImgCopy;//for drawing
|
||||||
|
|
||||||
|
QPoint m_mouse_pos_in_ui_coordinate;
|
||||||
|
QPoint m_mouse_pos_in_image_coordinate;
|
||||||
|
|
||||||
|
QVector<QColor> m_drawObjectBoxColor;
|
||||||
|
|
||||||
|
int m_uiX;
|
||||||
|
int m_uiY;
|
||||||
|
|
||||||
|
int m_imgX;
|
||||||
|
int m_imgY;
|
||||||
|
|
||||||
|
bool m_bMouseLeftButtonClicked;
|
||||||
|
|
||||||
|
static QColor BOX_COLORS[10];
|
||||||
|
|
||||||
|
QVector <ObjectLabelingBox> m_objBoundingBoxes;
|
||||||
|
|
||||||
|
void openImage(const QString &);
|
||||||
|
void showImage();
|
||||||
|
|
||||||
|
void loadLabelData(const QString & );
|
||||||
|
|
||||||
|
void setFocusObjectLabel(int);
|
||||||
|
void setFocusObjectName(QString);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void Mouse_Moved();
|
||||||
|
void Mouse_Pressed();
|
||||||
|
void Mouse_Release();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_focusedObjectLabel;
|
||||||
|
QString m_foucsedObjectName;
|
||||||
|
|
||||||
|
double m_aspectRatioWidth;
|
||||||
|
double m_aspectRatioHeight;
|
||||||
|
|
||||||
|
QPoint m_objStartPoint;
|
||||||
|
QPoint m_objEndPoint;
|
||||||
|
|
||||||
|
void setMousePosition(int , int);
|
||||||
|
|
||||||
|
void drawCrossLine(QPainter& , QColor , int thickWidth = 3);
|
||||||
|
void drawFocusedObjectBox(QPainter& , Qt::GlobalColor , int thickWidth = 3);
|
||||||
|
void drawObjectBoxes(QPainter& , int thickWidth = 3);
|
||||||
|
|
||||||
|
void removeFocusedObjectBox(QPoint point);
|
||||||
|
|
||||||
|
QRect getRectFromTwoPoints(QPoint p1, QPoint p2);
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // LABEL_IMG_H
|
11
main.cpp
Normal file
11
main.cpp
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
QApplication a(argc, argv);
|
||||||
|
MainWindow w;
|
||||||
|
w.show();
|
||||||
|
|
||||||
|
return a.exec();
|
||||||
|
}
|
381
mainwindow.cpp
Normal file
381
mainwindow.cpp
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
#include "mainwindow.h"
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QColorDialog>
|
||||||
|
#include <QKeyEvent>
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QShortcut>
|
||||||
|
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
|
using std::cout;
|
||||||
|
using std::endl;
|
||||||
|
using std::ofstream;
|
||||||
|
using std::ifstream;
|
||||||
|
using std::string;
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget *parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
ui(new Ui::MainWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
connect(ui->label_image, SIGNAL(Mouse_Moved()), this, SLOT(mouseCurrentPos()));
|
||||||
|
connect(ui->label_image, SIGNAL(Mouse_Pressed()), this, SLOT(mousePressed()));
|
||||||
|
connect(ui->label_image, SIGNAL(Mouse_Release()), this, SLOT(mouseReleased()));
|
||||||
|
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_S), this), SIGNAL(activated()), this, SLOT(save_label_data()));
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this), SIGNAL(activated()), this, SLOT(clear_label_data()));
|
||||||
|
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::Key_S), this), SIGNAL(activated()), this, SLOT(next_label()));
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::Key_W), this), SIGNAL(activated()), this, SLOT(prev_label()));
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::Key_A), this), SIGNAL(activated()), this, SLOT(prev_img()));
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::Key_D), this), SIGNAL(activated()), this, SLOT(next_img()));
|
||||||
|
connect(new QShortcut(QKeySequence(Qt::Key_Space), this), SIGNAL(activated()), this, SLOT(next_img()));
|
||||||
|
|
||||||
|
ui->tableWidget_label->horizontalHeader()->setStyleSheet("");
|
||||||
|
disconnect(ui->tableWidget_label->horizontalHeader(), SIGNAL(sectionPressed(int)),ui->tableWidget_label, SLOT(selectColumn(int)));
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_pushButton_open_files_clicked()
|
||||||
|
{
|
||||||
|
pjreddie_style_msgBox(QMessageBox::Information,"Help", "Step 1. Open Your Data Set Directory");
|
||||||
|
|
||||||
|
m_fileDir = QFileDialog::getExistingDirectory(
|
||||||
|
this,
|
||||||
|
tr("Open Dataset Directory"),
|
||||||
|
"C://");
|
||||||
|
|
||||||
|
QDir dir(m_fileDir);
|
||||||
|
|
||||||
|
QStringList fileList = dir.entryList(
|
||||||
|
QStringList() << "*.jpg" << "*.JPG" << "*.png",
|
||||||
|
QDir::Files);
|
||||||
|
|
||||||
|
if(fileList.size() == 0)
|
||||||
|
{
|
||||||
|
pjreddie_style_msgBox(QMessageBox::Critical,"Error", "This folder is empty");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pjreddie_style_msgBox(QMessageBox::Information,"Help", "Step 2. Open Your Label List File(*.txt or *.names)");
|
||||||
|
|
||||||
|
|
||||||
|
QString fileLabelList = QFileDialog::getOpenFileName(
|
||||||
|
this,
|
||||||
|
tr("Open LabelList file"),
|
||||||
|
"C://",
|
||||||
|
tr("LabelList Files (*.txt *.names)"));
|
||||||
|
|
||||||
|
if(fileLabelList.size() == 0)
|
||||||
|
{
|
||||||
|
pjreddie_style_msgBox(QMessageBox::Critical,"Error", "LabelList file is not opened()");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_fileList = fileList;
|
||||||
|
for(QString& str: m_fileList) str = m_fileDir + "/" + str;
|
||||||
|
|
||||||
|
|
||||||
|
load_label_list_data(fileLabelList);
|
||||||
|
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::init()
|
||||||
|
{
|
||||||
|
ui->horizontalSlider_images->setEnabled(true);
|
||||||
|
ui->pushButton_next->setEnabled(true);
|
||||||
|
ui->pushButton_prev->setEnabled(true);
|
||||||
|
ui->pushButton_save->setEnabled(true);
|
||||||
|
|
||||||
|
ui->horizontalSlider_images->setRange(0, m_fileList.size() - 1);
|
||||||
|
|
||||||
|
set_label(0);
|
||||||
|
goto_img(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::set_label_progress(const int fileIndex)
|
||||||
|
{
|
||||||
|
QString strCurFileIndex = QString::number(fileIndex);
|
||||||
|
QString strEndFileIndex = QString::number(m_fileList.size() - 1);
|
||||||
|
|
||||||
|
ui->label_progress->setText(strCurFileIndex + " / " + strEndFileIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::set_focused_file(const int fileIndex)
|
||||||
|
{
|
||||||
|
ui->label_file->setText("File: " + m_fileList.at(fileIndex));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::goto_img(int fileIndex)
|
||||||
|
{
|
||||||
|
bool indexIsOutOfRange = (fileIndex < 0 || fileIndex > m_fileList.size() - 1);
|
||||||
|
|
||||||
|
if(!indexIsOutOfRange)
|
||||||
|
{
|
||||||
|
m_fileIndex = fileIndex;
|
||||||
|
|
||||||
|
ui->label_image->openImage(m_fileList.at(m_fileIndex));
|
||||||
|
ui->label_image->loadLabelData(get_labeling_data(m_fileList.at(m_fileIndex)));
|
||||||
|
ui->label_image->showImage();
|
||||||
|
|
||||||
|
set_label_progress(m_fileIndex);
|
||||||
|
set_focused_file(m_fileIndex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::next_img()
|
||||||
|
{
|
||||||
|
save_label_data();
|
||||||
|
goto_img(m_fileIndex + 1);
|
||||||
|
|
||||||
|
ui->horizontalSlider_images->blockSignals(true);
|
||||||
|
ui->horizontalSlider_images->setValue(m_fileIndex);
|
||||||
|
ui->horizontalSlider_images->blockSignals(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::prev_img()
|
||||||
|
{
|
||||||
|
save_label_data();
|
||||||
|
goto_img(m_fileIndex - 1);
|
||||||
|
|
||||||
|
//it blocks crash with slider change
|
||||||
|
ui->horizontalSlider_images->blockSignals(true);
|
||||||
|
ui->horizontalSlider_images->setValue(m_fileIndex);
|
||||||
|
ui->horizontalSlider_images->blockSignals(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::save_label_data()const
|
||||||
|
{
|
||||||
|
if(m_fileList.size() == 0) return;
|
||||||
|
|
||||||
|
QString qstrOutputLabelData = get_labeling_data(m_fileList.at(m_fileIndex));
|
||||||
|
|
||||||
|
ofstream fileOutputLabelData(qstrOutputLabelData.toStdString());
|
||||||
|
|
||||||
|
if(fileOutputLabelData.is_open())
|
||||||
|
{
|
||||||
|
for(int i = 0; i < ui->label_image->m_objBoundingBoxes.size(); i++)
|
||||||
|
{
|
||||||
|
if(i != 0) fileOutputLabelData << '\n';
|
||||||
|
|
||||||
|
ObjectLabelingBox objBox = ui->label_image->m_objBoundingBoxes[i];
|
||||||
|
|
||||||
|
double midX = static_cast<double>(objBox.box.center().x()) / ui->label_image->m_inputImg.width();
|
||||||
|
double midY = static_cast<double>(objBox.box.center().y()) / ui->label_image->m_inputImg.height();
|
||||||
|
double width = static_cast<double>(objBox.box.width()) / ui->label_image->m_inputImg.width();
|
||||||
|
double height = static_cast<double>(objBox.box.height()) / ui->label_image->m_inputImg.height();
|
||||||
|
|
||||||
|
fileOutputLabelData << objBox.label;
|
||||||
|
fileOutputLabelData << " ";
|
||||||
|
fileOutputLabelData << std::fixed << std::setprecision(6) << midX;
|
||||||
|
fileOutputLabelData << " ";
|
||||||
|
fileOutputLabelData << std::fixed << std::setprecision(6) << midY;
|
||||||
|
fileOutputLabelData << " ";
|
||||||
|
fileOutputLabelData << std::fixed << std::setprecision(6) << width;
|
||||||
|
fileOutputLabelData << " ";
|
||||||
|
fileOutputLabelData << std::fixed << std::setprecision(6) << height;
|
||||||
|
}
|
||||||
|
|
||||||
|
fileOutputLabelData.close();
|
||||||
|
|
||||||
|
ui->textEdit_log->setText(qstrOutputLabelData + " saved.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::clear_label_data()
|
||||||
|
{
|
||||||
|
ui->label_image->m_objBoundingBoxes.clear();
|
||||||
|
ui->label_image->showImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::next_label()
|
||||||
|
{
|
||||||
|
set_label(m_labelIndex + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::prev_label()
|
||||||
|
{
|
||||||
|
set_label(m_labelIndex - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::load_label_list_data(QString qstrLabelListFile)
|
||||||
|
{
|
||||||
|
ifstream inputLabelListFile(qstrLabelListFile.toStdString());
|
||||||
|
|
||||||
|
if(inputLabelListFile.is_open())
|
||||||
|
{
|
||||||
|
m_labelNameList.clear();
|
||||||
|
|
||||||
|
string strLabel;
|
||||||
|
QStringList verticalHeaderLabels;
|
||||||
|
|
||||||
|
int fileIndex = 0;
|
||||||
|
while(inputLabelListFile >> strLabel)
|
||||||
|
{
|
||||||
|
int nRow = ui->tableWidget_label->rowCount();
|
||||||
|
|
||||||
|
QString qstrLabel = QString().fromStdString(strLabel);
|
||||||
|
QColor labelColor = label_img::BOX_COLORS[(fileIndex++)%10];
|
||||||
|
m_labelNameList << qstrLabel;
|
||||||
|
|
||||||
|
ui->tableWidget_label->insertRow(nRow);
|
||||||
|
ui->tableWidget_label->setItem(nRow, 0, new QTableWidgetItem(qstrLabel));
|
||||||
|
ui->tableWidget_label->setItem(nRow, 1, new QTableWidgetItem(QString().fromStdString("")));
|
||||||
|
ui->tableWidget_label->item(nRow, 1)->setBackgroundColor(labelColor);
|
||||||
|
ui->tableWidget_label->item(nRow, 0)->setFlags(ui->tableWidget_label->item(nRow, 0)->flags() ^ Qt::ItemIsEditable);
|
||||||
|
ui->tableWidget_label->item(nRow, 1)->setFlags(ui->tableWidget_label->item(nRow, 1)->flags() ^ Qt::ItemIsEditable ^ Qt::ItemIsSelectable);
|
||||||
|
|
||||||
|
ui->label_image->m_drawObjectBoxColor.push_back(labelColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString MainWindow::get_labeling_data(QString qstrImgFile)const
|
||||||
|
{
|
||||||
|
string strImgFile = qstrImgFile.toStdString();
|
||||||
|
string strLabelData = strImgFile.substr(0, strImgFile.find_last_of('.')) + ".txt";
|
||||||
|
|
||||||
|
return QString().fromStdString(strLabelData);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::set_label(int labelIndex)
|
||||||
|
{
|
||||||
|
bool indexIsOutOfRange = (labelIndex < 0 || labelIndex > m_labelNameList.size() - 1);
|
||||||
|
|
||||||
|
if(!indexIsOutOfRange)
|
||||||
|
{
|
||||||
|
m_labelIndex = labelIndex;
|
||||||
|
ui->label_image->setFocusObjectLabel(m_labelIndex);
|
||||||
|
ui->label_image->setFocusObjectName(m_labelNameList.at(m_labelIndex));
|
||||||
|
ui->tableWidget_label->setCurrentCell(m_labelIndex, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::set_label_color(int index, QColor color)
|
||||||
|
{
|
||||||
|
ui->label_image->m_drawObjectBoxColor.replace(index, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::pjreddie_style_msgBox(QMessageBox::Icon icon, QString title, QString content)
|
||||||
|
{
|
||||||
|
QMessageBox msgBox(icon, title, content, QMessageBox::Ok);
|
||||||
|
|
||||||
|
QFont font;
|
||||||
|
font.setBold(true);
|
||||||
|
msgBox.setFont(font);
|
||||||
|
msgBox.button(QMessageBox::Ok)->setFont(font);
|
||||||
|
msgBox.button(QMessageBox::Ok)->setStyleSheet("border-style: outset; border-width: 2px; border-color: rgb(0, 255, 0); color : rgb(0, 255, 0);");
|
||||||
|
msgBox.setStyleSheet("background-color : rgb(34, 0, 85); color : rgb(0, 255, 0);");
|
||||||
|
|
||||||
|
msgBox.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::wheelEvent(QWheelEvent *ev)
|
||||||
|
{
|
||||||
|
if(ev->delta() > 0) // up Wheel
|
||||||
|
prev_img();
|
||||||
|
else if(ev->delta() < 0) //down Wheel
|
||||||
|
next_img();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_pushButton_prev_clicked()
|
||||||
|
{
|
||||||
|
prev_img();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_pushButton_next_clicked()
|
||||||
|
{
|
||||||
|
next_img();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::keyPressEvent(QKeyEvent * event)
|
||||||
|
{
|
||||||
|
cout << "key pressed" <<endl;
|
||||||
|
int nKey = event->key();
|
||||||
|
bool graveAccentKeyIsPressed = (nKey == Qt::Key_QuoteLeft);
|
||||||
|
bool numKeyIsPressed = (nKey >= Qt::Key_0 && nKey <= Qt::Key_9 );
|
||||||
|
|
||||||
|
if(graveAccentKeyIsPressed)
|
||||||
|
{
|
||||||
|
ui->label_image->setFocusObjectLabel(0);
|
||||||
|
ui->label_image->setFocusObjectName(m_labelNameList.at(0));
|
||||||
|
ui->tableWidget_label->setCurrentCell(0, 0); //foucs cell(0,0)
|
||||||
|
}
|
||||||
|
else if(numKeyIsPressed)
|
||||||
|
{
|
||||||
|
int asciiToNumber = nKey - Qt::Key_0;
|
||||||
|
|
||||||
|
if(asciiToNumber < m_labelNameList.size() )
|
||||||
|
{
|
||||||
|
ui->label_image->setFocusObjectLabel(asciiToNumber);
|
||||||
|
ui->label_image->setFocusObjectName(m_labelNameList.at(asciiToNumber));
|
||||||
|
ui->tableWidget_label->setCurrentCell(asciiToNumber, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::mouseCurrentPos()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::mousePressed()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::mouseReleased()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_horizontalSlider_images_valueChanged(int value)
|
||||||
|
{
|
||||||
|
|
||||||
|
// cout<<"kiff"<<endl;
|
||||||
|
// save_label_data(); //prev data save
|
||||||
|
// goto_img(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_pushButton_save_clicked()
|
||||||
|
{
|
||||||
|
save_label_data();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_tableWidget_label_cellDoubleClicked(int row, int column)
|
||||||
|
{
|
||||||
|
if(column == 1)
|
||||||
|
{
|
||||||
|
QColor color = QColorDialog::getColor(Qt::white,this,"Set Label Color");
|
||||||
|
if(color.isValid())
|
||||||
|
{
|
||||||
|
set_label_color(row, color);
|
||||||
|
ui->tableWidget_label->item(row, 1)->setBackgroundColor(color);
|
||||||
|
}
|
||||||
|
set_label(row);
|
||||||
|
ui->label_image->showImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_tableWidget_label_cellClicked(int row, int column)
|
||||||
|
{
|
||||||
|
set_label(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_horizontalSlider_images_sliderMoved(int position)
|
||||||
|
{
|
||||||
|
goto_img(position);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::on_horizontalSlider_images_sliderPressed()
|
||||||
|
{
|
||||||
|
//save_label_data(); //prev data save
|
||||||
|
}
|
87
mainwindow.h
Normal file
87
mainwindow.h
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include <QWheelEvent>
|
||||||
|
#include <QTableWidgetItem>
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow(QWidget *parent = nullptr);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
Q_SIGNALS:
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_pushButton_open_files_clicked();
|
||||||
|
void on_pushButton_save_clicked();
|
||||||
|
|
||||||
|
|
||||||
|
void on_pushButton_prev_clicked();
|
||||||
|
void on_pushButton_next_clicked();
|
||||||
|
|
||||||
|
void on_horizontalSlider_images_valueChanged(int value);
|
||||||
|
|
||||||
|
void keyPressEvent(QKeyEvent *);
|
||||||
|
|
||||||
|
void mouseCurrentPos();
|
||||||
|
void mousePressed();
|
||||||
|
void mouseReleased();
|
||||||
|
|
||||||
|
void next_img();
|
||||||
|
void prev_img();
|
||||||
|
void save_label_data() const;
|
||||||
|
void clear_label_data();
|
||||||
|
|
||||||
|
void next_label();
|
||||||
|
void prev_label();
|
||||||
|
|
||||||
|
void on_tableWidget_label_cellDoubleClicked(int row, int column);
|
||||||
|
void on_tableWidget_label_cellClicked(int row, int column);
|
||||||
|
|
||||||
|
void on_horizontalSlider_images_sliderMoved(int position);
|
||||||
|
|
||||||
|
void on_horizontalSlider_images_sliderPressed();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
|
QString m_fileDir;
|
||||||
|
QStringList m_fileList;
|
||||||
|
int m_fileIndex;
|
||||||
|
|
||||||
|
QStringList m_labelNameList;
|
||||||
|
int m_labelIndex;
|
||||||
|
|
||||||
|
void init();
|
||||||
|
|
||||||
|
void img_open(const int);
|
||||||
|
void set_label_progress(const int);
|
||||||
|
void set_focused_file(const int);
|
||||||
|
|
||||||
|
void goto_img(int);
|
||||||
|
|
||||||
|
void load_label_list_data(QString);
|
||||||
|
QString get_labeling_data(QString)const;
|
||||||
|
|
||||||
|
void set_label(int);
|
||||||
|
void set_label_color(int , QColor);
|
||||||
|
|
||||||
|
void pjreddie_style_msgBox(QMessageBox::Icon, QString, QString);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void wheelEvent(QWheelEvent *);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
700
mainwindow.ui
Normal file
700
mainwindow.ui
Normal file
@ -0,0 +1,700 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1514</width>
|
||||||
|
<height>953</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>1400</width>
|
||||||
|
<height>920</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::StrongFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Image Labeling Tool</string>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralWidget">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>1363</width>
|
||||||
|
<height>867</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout">
|
||||||
|
<item row="0" column="0">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_file">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>1275</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>13</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">color : rgb(255, 187, 0);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>File:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="label_img" name="label_image">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>1280</width>
|
||||||
|
<height>720</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>18</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="cursor">
|
||||||
|
<cursorShape>ArrowCursor</cursorShape>
|
||||||
|
</property>
|
||||||
|
<property name="mouseTracking">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QLabel { background-color : rgb(0, 0, 17); color : rgb(187, 255, 254);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);}
|
||||||
|
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>3</number>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Open Data Set Directory...</string>
|
||||||
|
</property>
|
||||||
|
<property name="scaledContents">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
<property name="margin">
|
||||||
|
<number>-1</number>
|
||||||
|
</property>
|
||||||
|
<property name="buddy">
|
||||||
|
<cstring>label_image</cstring>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_prev">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>75</width>
|
||||||
|
<height>23</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Prev</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="autoDefault">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="default">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_next">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>75</width>
|
||||||
|
<height>23</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Next</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string>Del</string>
|
||||||
|
</property>
|
||||||
|
<property name="autoDefault">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="default">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QSlider" name="horizontalSlider_images">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>1</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>881</width>
|
||||||
|
<height>22</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::ClickFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">
|
||||||
|
QSlider::groove:horizontal {
|
||||||
|
border: 1px solid #999999;
|
||||||
|
height: 8px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */
|
||||||
|
background: rgb(0, 255, 255);
|
||||||
|
margin: 2px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QSlider::handle:horizontal {
|
||||||
|
background: rgb(255, 187, 0);
|
||||||
|
border: 1px solid #5c5c5c;
|
||||||
|
width: 18px;
|
||||||
|
margin: -10px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
</string>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="pageStep">
|
||||||
|
<number>10</number>
|
||||||
|
</property>
|
||||||
|
<property name="tracking">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="orientation">
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_progress">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>211</width>
|
||||||
|
<height>21</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::StyledPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>0 / 0</string>
|
||||||
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_open_files">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>291</width>
|
||||||
|
<height>91</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>91</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
<kerning>true</kerning>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Open Files</string>
|
||||||
|
</property>
|
||||||
|
<property name="autoDefault">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="default">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="pushButton_save">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>291</width>
|
||||||
|
<height>91</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>91</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
<kerning>true</kerning>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Save</string>
|
||||||
|
</property>
|
||||||
|
<property name="shortcut">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
<property name="autoDefault">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="default">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="flat">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_log">
|
||||||
|
<property name="enabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>41</width>
|
||||||
|
<height>12</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>12</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<italic>false</italic>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">color : rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Log</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTextEdit" name="textEdit_log">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>640</width>
|
||||||
|
<height>70</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>70</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);</string>
|
||||||
|
</property>
|
||||||
|
<property name="tabChangesFocus">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="readOnly">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_table_widget_padding">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>202</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>202</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>13</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QTableWidget" name="tableWidget_label">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>204</width>
|
||||||
|
<height>851</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>204</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>10</pointsize>
|
||||||
|
<weight>75</weight>
|
||||||
|
<bold>true</bold>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="focusPolicy">
|
||||||
|
<enum>Qt::NoFocus</enum>
|
||||||
|
</property>
|
||||||
|
<property name="styleSheet">
|
||||||
|
<string notr="true">QHeaderView::section {
|
||||||
|
background-color: rgb(0, 0, 17);
|
||||||
|
color: rgb(255, 187, 0);
|
||||||
|
padding-left: 4px;
|
||||||
|
border: 2px solid rgb(0, 255, 255);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
QTableWidget
|
||||||
|
{
|
||||||
|
border-style: outset;
|
||||||
|
border-width: 2px;
|
||||||
|
border-color: rgb(0, 255, 255);
|
||||||
|
color:rgb(187, 255, 254);
|
||||||
|
gridline-width:2px;
|
||||||
|
gridline-color: rgb(0, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
QTableView {
|
||||||
|
selection-background-color: qlineargradient(x1: 0, y1: 0, x2: 1.0, y2: 1.0, stop: 0 rgb(34, 0, 85), stop: 1 white);
|
||||||
|
selection-color: rgb(0, 255, 0);
|
||||||
|
}</string>
|
||||||
|
</property>
|
||||||
|
<property name="frameShape">
|
||||||
|
<enum>QFrame::WinPanel</enum>
|
||||||
|
</property>
|
||||||
|
<property name="frameShadow">
|
||||||
|
<enum>QFrame::Plain</enum>
|
||||||
|
</property>
|
||||||
|
<property name="lineWidth">
|
||||||
|
<number>5</number>
|
||||||
|
</property>
|
||||||
|
<property name="showGrid">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="sortingEnabled">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="cornerButtonEnabled">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
<property name="columnCount">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<attribute name="horizontalHeaderVisible">
|
||||||
|
<bool>true</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderHighlightSections">
|
||||||
|
<bool>true</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="horizontalHeaderShowSortIndicator" stdset="0">
|
||||||
|
<bool>true</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderVisible">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderHighlightSections">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="verticalHeaderShowSortIndicator" stdset="0">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
<column>
|
||||||
|
<property name="text">
|
||||||
|
<string>Color</string>
|
||||||
|
</property>
|
||||||
|
</column>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenuBar" name="menuBar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>1514</width>
|
||||||
|
<height>21</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="mainToolBar">
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusBar"/>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<customwidgets>
|
||||||
|
<customwidget>
|
||||||
|
<class>label_img</class>
|
||||||
|
<extends>QLabel</extends>
|
||||||
|
<header location="global">label_img.h</header>
|
||||||
|
</customwidget>
|
||||||
|
</customwidgets>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue
Block a user