Merge pull request #56 from e8035669/master

Visualize class names on the bounding box
This commit is contained in:
Yonghye Kwon 2023-01-10 21:33:50 +09:00 committed by GitHub
commit cab3dfcb8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 87 additions and 16 deletions

View File

@ -80,6 +80,7 @@ void label_img::init()
{ {
m_objBoundingBoxes.clear(); m_objBoundingBoxes.clear();
m_bLabelingStarted = false; m_bLabelingStarted = false;
m_bVisualizeClassName = false;
m_focusedObjectLabel = 0; m_focusedObjectLabel = 0;
QPoint mousePosInUi = this->mapFromGlobal(QCursor::pos()); QPoint mousePosInUi = this->mapFromGlobal(QCursor::pos());
@ -125,7 +126,8 @@ void label_img::openImage(const QString &qstrImg, bool &ret)
m_inputImg = img.copy(); m_inputImg = img.copy();
m_inputImg = m_inputImg.convertToFormat(QImage::Format_RGB888); m_inputImg = m_inputImg.convertToFormat(QImage::Format_RGB888);
m_resized_inputImg = m_inputImg.scaled(this->width(), this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); m_resized_inputImg = m_inputImg.scaled(this->width(), this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation)
.convertToFormat(QImage::Format_RGB888);
m_bLabelingStarted = false; m_bLabelingStarted = false;
@ -148,7 +150,8 @@ void label_img::showImage()
if(m_inputImg.isNull()) return; if(m_inputImg.isNull()) return;
if(m_resized_inputImg.width() != this->width() or m_resized_inputImg.height() != this->height()) if(m_resized_inputImg.width() != this->width() or m_resized_inputImg.height() != this->height())
{ {
m_resized_inputImg = m_inputImg.scaled(this->width(), this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation); m_resized_inputImg = m_inputImg.scaled(this->width(), this->height(),Qt::IgnoreAspectRatio,Qt::SmoothTransformation)
.convertToFormat(QImage::Format_RGB888);
} }
QImage img = m_resized_inputImg; QImage img = m_resized_inputImg;
@ -156,6 +159,11 @@ void label_img::showImage()
gammaTransform(img); gammaTransform(img);
QPainter painter(&img); QPainter painter(&img);
QFont font = painter.font();
int fontSize = 16, xMargin = 5, yMargin = 2;
font.setPixelSize(fontSize);
font.setBold(true);
painter.setFont(font);
int penThick = 3; int penThick = 3;
@ -164,6 +172,8 @@ void label_img::showImage()
drawCrossLine(painter, crossLineColor, penThick); drawCrossLine(painter, crossLineColor, penThick);
drawFocusedObjectBox(painter, Qt::magenta, penThick); drawFocusedObjectBox(painter, Qt::magenta, penThick);
drawObjectBoxes(painter, penThick); drawObjectBoxes(painter, penThick);
if(m_bVisualizeClassName)
drawObjectLabels(painter, penThick, fontSize, xMargin, yMargin);
this->setPixmap(QPixmap::fromImage(img)); this->setPixmap(QPixmap::fromImage(img));
} }
@ -279,6 +289,36 @@ void label_img::drawObjectBoxes(QPainter& painter, int thickWidth)
} }
} }
void label_img::drawObjectLabels(QPainter& painter, int thickWidth, int fontPixelSize, int xMargin, int yMargin)
{
QFontMetrics fontMetrics = painter.fontMetrics();
QPen blackPen;
for(ObjectLabelingBox boundingbox: m_objBoundingBoxes)
{
QColor labelColor = m_drawObjectBoxColor.at(boundingbox.label);
QRect rectUi = cvtRelativeToAbsoluteRectInUi(boundingbox.box);
QRect labelRect = fontMetrics.boundingRect(m_objList.at(boundingbox.label));
if (rectUi.top() > fontPixelSize + yMargin * 2 + thickWidth + 1) {
labelRect.moveTo(rectUi.topLeft() + QPoint(-thickWidth / 2, -(fontPixelSize + yMargin * 2 + thickWidth + 1)));
labelRect.adjust(0, 0, xMargin * 2, yMargin * 2);
} else {
labelRect.moveTo(rectUi.topLeft() + QPoint(-thickWidth / 2, 0));
labelRect.adjust(0, 0, xMargin * 2, yMargin * 2);
}
painter.fillRect(labelRect, labelColor);
if (qGray(m_drawObjectBoxColor.at(boundingbox.label).rgb()) > 120) {
blackPen.setColor(QColorConstants::Black);
} else {
blackPen.setColor(QColorConstants::White);
}
painter.setPen(blackPen);
painter.drawText(labelRect.topLeft() + QPoint(xMargin, yMargin + fontPixelSize), m_objList.at(boundingbox.label));
}
}
void label_img::gammaTransform(QImage &image) void label_img::gammaTransform(QImage &image)
{ {
uchar* bits = image.bits(); uchar* bits = image.bits();

View File

@ -25,6 +25,7 @@ public:
void mouseReleaseEvent(QMouseEvent *ev); void mouseReleaseEvent(QMouseEvent *ev);
QVector<QColor> m_drawObjectBoxColor; QVector<QColor> m_drawObjectBoxColor;
QStringList m_objList;
int m_uiX; int m_uiX;
int m_uiY; int m_uiY;
@ -33,6 +34,7 @@ public:
int m_imgY; int m_imgY;
bool m_bLabelingStarted; bool m_bLabelingStarted;
bool m_bVisualizeClassName;
static QColor BOX_COLORS[10]; static QColor BOX_COLORS[10];
@ -86,6 +88,7 @@ private:
void drawCrossLine(QPainter& , QColor , int thickWidth = 3); void drawCrossLine(QPainter& , QColor , int thickWidth = 3);
void drawFocusedObjectBox(QPainter& , Qt::GlobalColor , int thickWidth = 3); void drawFocusedObjectBox(QPainter& , Qt::GlobalColor , int thickWidth = 3);
void drawObjectBoxes(QPainter& , int thickWidth = 3); void drawObjectBoxes(QPainter& , int thickWidth = 3);
void drawObjectLabels(QPainter& , int thickWidth = 3, int fontPixelSize = 14, int xMargin = 5, int yMargin = 2);
void gammaTransform(QImage& image); void gammaTransform(QImage& image);
void removeFocusedObjectBox(QPointF); void removeFocusedObjectBox(QPointF);
}; };

View File

@ -198,7 +198,7 @@ void MainWindow::remove_img()
} }
else if( m_imgIndex == m_imgList.size()) else if( m_imgIndex == m_imgList.size())
{ {
m_imgIndex --; m_imgIndex--;
} }
goto_img(m_imgIndex); goto_img(m_imgIndex);
@ -250,6 +250,7 @@ void MainWindow::load_label_list_data(QString qstrLabelListFile)
ui->label_image->m_drawObjectBoxColor.push_back(labelColor); ui->label_image->m_drawObjectBoxColor.push_back(labelColor);
} }
ui->label_image->m_objList = m_objList;
} }
} }
@ -360,11 +361,6 @@ void MainWindow::open_obj_file(bool& ret)
} }
} }
void MainWindow::reupdate_img_list()
{
}
void MainWindow::wheelEvent(QWheelEvent *ev) void MainWindow::wheelEvent(QWheelEvent *ev)
{ {
if(ev->angleDelta().y() > 0) // up Wheel if(ev->angleDelta().y() > 0) // up Wheel
@ -479,3 +475,9 @@ void MainWindow::on_horizontalSlider_contrast_sliderMoved(int value)
ui->label_image->setContrastGamma(percentageToGamma); ui->label_image->setContrastGamma(percentageToGamma);
ui->label_contrast->setText(QString("Contrast(%) ") + QString::number(int(valueToPercentage * 100.))); ui->label_contrast->setText(QString("Contrast(%) ") + QString::number(int(valueToPercentage * 100.)));
} }
void MainWindow::on_checkBox_visualize_class_name_clicked(bool checked)
{
ui->label_image->m_bVisualizeClassName = checked;
ui->label_image->showImage();
}

View File

@ -23,10 +23,6 @@ public:
private slots: private slots:
void on_pushButton_open_files_clicked(); void on_pushButton_open_files_clicked();
// void on_pushButton_change_dir_clicked();
// void on_pushButton_save_clicked();
// void on_pushButton_remove_clicked();
void on_pushButton_prev_clicked(); void on_pushButton_prev_clicked();
void on_pushButton_next_clicked(); void on_pushButton_next_clicked();
@ -48,6 +44,8 @@ private slots:
void on_horizontalSlider_contrast_sliderMoved(int value); void on_horizontalSlider_contrast_sliderMoved(int value);
void on_checkBox_visualize_class_name_clicked(bool checked);
private: private:
void init(); void init();
void init_table_widget(); void init_table_widget();
@ -71,8 +69,6 @@ private:
void open_img_dir(bool&); void open_img_dir(bool&);
void open_obj_file(bool&); void open_obj_file(bool&);
void reupdate_img_list();
Ui::MainWindow *ui; Ui::MainWindow *ui;
QString m_imgDir; QString m_imgDir;

View File

@ -57,7 +57,7 @@
</size> </size>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="3" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_5"> <layout class="QHBoxLayout" name="horizontalLayout_5">
<item> <item>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
@ -77,6 +77,7 @@
</property> </property>
<property name="font"> <property name="font">
<font> <font>
<family>Arial</family>
<pointsize>18</pointsize> <pointsize>18</pointsize>
<weight>75</weight> <weight>75</weight>
<bold>true</bold> <bold>true</bold>
@ -106,7 +107,7 @@ border-color: rgb(0, 255, 255);}
<number>3</number> <number>3</number>
</property> </property>
<property name="text"> <property name="text">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open a Dataset Directory...&lt;/p&gt;&lt;p&gt;D: Next Image&lt;/p&gt;&lt;p&gt;A: Prev Image&lt;/p&gt;&lt;p&gt;&lt;br/&gt;Ctrl + S: Save&lt;/p&gt;&lt;p&gt;Ctrl + D: Delete an Image&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string> <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Open a Dataset Directory...&lt;/p&gt;&lt;p&gt;D: Next Image&lt;/p&gt;&lt;p&gt;A: Prev Image&lt;/p&gt;&lt;p&gt;S: Next Class&lt;/p&gt;&lt;p&gt;W: Prev Class&lt;/p&gt;&lt;p&gt;V: Visualize Class Name&lt;/p&gt;&lt;p&gt;O: Open Files&lt;br/&gt;Ctrl + S: Save&lt;/p&gt;&lt;p&gt;Ctrl + D: Delete an Image&lt;br/&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property> </property>
<property name="scaledContents"> <property name="scaledContents">
<bool>true</bool> <bool>true</bool>
@ -396,6 +397,9 @@ border-color: rgb(0, 255, 255);</string>
<property name="text"> <property name="text">
<string>Open Files</string> <string>Open Files</string>
</property> </property>
<property name="shortcut">
<string>O</string>
</property>
<property name="autoDefault"> <property name="autoDefault">
<bool>false</bool> <bool>false</bool>
</property> </property>
@ -575,6 +579,32 @@ QTableView {
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_6">
<item>
<widget class="QCheckBox" name="checkBox_visualize_class_name">
<property name="font">
<font>
<family>Arial</family>
<pointsize>12</pointsize>
<underline>false</underline>
<strikeout>false</strikeout>
</font>
</property>
<property name="styleSheet">
<string notr="true">background-color : rgb(0, 0, 17);color : rgb(0, 255, 255);
</string>
</property>
<property name="text">
<string>Visualize Class Name</string>
</property>
<property name="shortcut">
<string>V</string>
</property>
</widget>
</item>
</layout>
</item>
</layout> </layout>
</widget> </widget>
<widget class="QMenuBar" name="menuBar"> <widget class="QMenuBar" name="menuBar">