Added visualization of the differences between 2 images.

This commit is contained in:
Nissim Hadar 2017-12-11 16:54:35 -08:00
parent 9ff1b4bcb1
commit ca3777442c
5 changed files with 94 additions and 38 deletions

View file

@ -8,6 +8,7 @@
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
#include "ImageComparer.h"
#include "common.h"
#include <cmath>
@ -26,11 +27,6 @@ double ImageComparer::compareImages(QImage resultImage, QImage expectedImage) co
const double c1 = pow((K1 * L), 2);
const double c2 = pow((K2 * L), 2);
// Coefficients for luminosity calculation
const double R_Y = 0.212655f;
const double G_Y = 0.715158f;
const double B_Y = 0.072187f;
// First go over all full 8x8 blocks
// This is done in 3 loops
// 1) Read the pixels into a linear array (an optimization)

View file

@ -34,4 +34,9 @@ enum UserResponse {
USER_RESPONSE_ABORT
};
// Coefficients for luminosity calculation
const double R_Y = 0.212655f;
const double G_Y = 0.715158f;
const double B_Y = 0.072187f;
#endif // hifi_common_h

View file

@ -16,6 +16,37 @@ MismatchWindow::MismatchWindow(QWidget *parent) : QDialog(parent) {
expectedImage->setScaledContents(true);
resultImage->setScaledContents(true);
diffImage->setScaledContents(true);
}
QPixmap MismatchWindow::computeDiffPixmap(QImage expectedImage, QImage resultImage) {
// This is an optimization, as QImage.setPixel() is embarrassingly slow
unsigned char* buffer = new unsigned char[expectedImage.height() * expectedImage.width() * 3];
// loop over each pixel
for (int y = 0; y < expectedImage.height(); ++y) {
for (int x = 0; x < expectedImage.width(); ++x) {
QRgb pixelP = expectedImage.pixel(QPoint(x, y));
QRgb pixelQ = resultImage.pixel(QPoint(x, y));
// Convert to luminance
double p = R_Y * qRed(pixelP) + G_Y * qGreen(pixelP) + B_Y * qBlue(pixelP);
double q = R_Y * qRed(pixelQ) + G_Y * qGreen(pixelQ) + B_Y * qBlue(pixelQ);
int absDiff = (int)(fabs(p - q));
buffer[3 * (x + y * expectedImage.width()) + 0] = absDiff;
buffer[3 * (x + y * expectedImage.width()) + 1] = absDiff;
buffer[3 * (x + y * expectedImage.width()) + 2] = absDiff;
}
}
QImage diffImage(buffer, expectedImage.width(), expectedImage.height(), QImage::Format_RGB888);
QPixmap resultPixmap = QPixmap::fromImage(diffImage);
delete[] buffer;
return resultPixmap;
}
void MismatchWindow::setTestFailure(TestFailure testFailure) {
@ -24,10 +55,19 @@ void MismatchWindow::setTestFailure(TestFailure testFailure) {
imagePath->setText("Path to test: " + testFailure._pathname);
expectedFilename->setText(testFailure._expectedImageFilename);
expectedImage->setPixmap(QPixmap(testFailure._pathname + testFailure._expectedImageFilename));
resultFilename->setText(testFailure._actualImageFilename);
resultImage->setPixmap(QPixmap(testFailure._pathname + testFailure._actualImageFilename));
QPixmap expectedPixmap = QPixmap(testFailure._pathname + testFailure._expectedImageFilename);
QPixmap actualPixmap = QPixmap(testFailure._pathname + testFailure._actualImageFilename);
QPixmap diffPixmap = computeDiffPixmap(
QImage(testFailure._pathname + testFailure._expectedImageFilename),
QImage(testFailure._pathname + testFailure._actualImageFilename)
);
expectedImage->setPixmap(expectedPixmap);
resultImage->setPixmap(actualPixmap);
diffImage->setPixmap(diffPixmap);
}
void MismatchWindow::on_passTestButton_clicked() {

View file

@ -25,6 +25,8 @@ public:
UserResponse getUserResponse() { return _userResponse; }
QPixmap computeDiffPixmap(QImage expectedImage, QImage resultImage);
private slots:
void on_passTestButton_clicked();
void on_failTestButton_clicked();

View file

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>1585</width>
<height>694</height>
<width>1782</width>
<height>942</height>
</rect>
</property>
<property name="windowTitle">
@ -16,10 +16,10 @@
<widget class="QLabel" name="expectedImage">
<property name="geometry">
<rect>
<x>20</x>
<y>170</y>
<width>720</width>
<height>362</height>
<x>10</x>
<y>20</y>
<width>800</width>
<height>450</height>
</rect>
</property>
<property name="text">
@ -29,28 +29,41 @@
<widget class="QLabel" name="resultImage">
<property name="geometry">
<rect>
<x>760</x>
<y>170</y>
<width>720</width>
<height>362</height>
<x>900</x>
<y>20</y>
<width>800</width>
<height>450</height>
</rect>
</property>
<property name="text">
<string>result image</string>
</property>
</widget>
<widget class="QLabel" name="diffImage">
<property name="geometry">
<rect>
<x>540</x>
<y>480</y>
<width>800</width>
<height>450</height>
</rect>
</property>
<property name="text">
<string>diff image</string>
</property>
</widget>
<widget class="QLabel" name="resultFilename">
<property name="geometry">
<rect>
<x>760</x>
<y>90</y>
<width>800</width>
<x>60</x>
<y>660</y>
<width>480</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@ -60,15 +73,15 @@
<widget class="QLabel" name="expectedFilename">
<property name="geometry">
<rect>
<x>40</x>
<y>90</y>
<width>700</width>
<x>60</x>
<y>630</y>
<width>480</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@ -78,15 +91,15 @@
<widget class="QLabel" name="imagePath">
<property name="geometry">
<rect>
<x>40</x>
<y>30</y>
<x>20</x>
<y>600</y>
<width>1200</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">
@ -97,7 +110,7 @@
<property name="geometry">
<rect>
<x>30</x>
<y>600</y>
<y>790</y>
<width>75</width>
<height>23</height>
</rect>
@ -109,8 +122,8 @@
<widget class="QPushButton" name="failTestButton">
<property name="geometry">
<rect>
<x>330</x>
<y>600</y>
<x>120</x>
<y>790</y>
<width>75</width>
<height>23</height>
</rect>
@ -122,8 +135,8 @@
<widget class="QPushButton" name="abortTestsButton">
<property name="geometry">
<rect>
<x>630</x>
<y>600</y>
<x>210</x>
<y>790</y>
<width>75</width>
<height>23</height>
</rect>
@ -135,15 +148,15 @@
<widget class="QLabel" name="errorLabel">
<property name="geometry">
<rect>
<x>810</x>
<y>600</y>
<width>720</width>
<x>30</x>
<y>850</y>
<width>500</width>
<height>28</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>16</pointsize>
<pointsize>12</pointsize>
</font>
</property>
<property name="text">