Turn on calculating of image statistics

This commit is contained in:
2019-09-27 12:18:14 +02:00
parent 3c1f7b23ae
commit f968d0eab2
6 changed files with 63 additions and 18 deletions
+17 -5
View File
@@ -5,13 +5,14 @@
using namespace std; using namespace std;
const int DEFAULT_WIDTH = 3; const int DEFAULT_WIDTH = 2;
Image::Image(const QString name) : Image::Image(const QString name, ImageRingList *ringList) :
m_loading(false), m_loading(false),
m_released(true), m_released(true),
m_current(false), m_current(false),
m_name(name) m_name(name),
m_ringList(ringList)
{ {
} }
@@ -21,7 +22,7 @@ void Image::load()
{ {
m_loading = true; m_loading = true;
m_released = false; m_released = false;
QThreadPool::globalInstance()->start(new LoadRunable(m_name, this)); QThreadPool::globalInstance()->start(new LoadRunable(m_name, this, m_ringList->calculateStats()));
} }
if(!m_loading && !m_pixmap.isNull()) if(!m_loading && !m_pixmap.isNull())
emit pixmapLoaded(this); emit pixmapLoaded(this);
@@ -67,6 +68,7 @@ void Image::imageLoaded(QImage img, ImageInfoData info)
ImageRingList::ImageRingList(QObject *parent) : QObject(parent) ImageRingList::ImageRingList(QObject *parent) : QObject(parent)
, m_liveMode(false) , m_liveMode(false)
, m_calculateStats(false)
{ {
connect(&m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(dirChanged(QString))); connect(&m_fileSystemWatcher, SIGNAL(directoryChanged(QString)), this, SLOT(dirChanged(QString)));
} }
@@ -146,6 +148,16 @@ void ImageRingList::setLiveMode(bool live)
m_liveMode = live; m_liveMode = live;
} }
void ImageRingList::setCalculateStats(bool stats)
{
m_calculateStats = stats;
}
bool ImageRingList::calculateStats() const
{
return m_calculateStats;
}
void ImageRingList::setFiles(const QStringList files, const QString &currentFile) void ImageRingList::setFiles(const QStringList files, const QString &currentFile)
{ {
QThreadPool::globalInstance()->clear(); QThreadPool::globalInstance()->clear();
@@ -153,7 +165,7 @@ void ImageRingList::setFiles(const QStringList files, const QString &currentFile
m_images.clear(); m_images.clear();
foreach(const QString &file, files) foreach(const QString &file, files)
{ {
ImagePtr ptr = make_shared<Image>(file); ImagePtr ptr = make_shared<Image>(file, this);
connect(ptr.get(), SIGNAL(pixmapLoaded(Image*)), this, SLOT(imageLoaded(Image*))); connect(ptr.get(), SIGNAL(pixmapLoaded(Image*)), this, SLOT(imageLoaded(Image*)));
m_images.append(ptr); m_images.append(ptr);
} }
+7 -1
View File
@@ -8,6 +8,8 @@
#include <memory> #include <memory>
#include "imageinfo.h" #include "imageinfo.h"
class ImageRingList;
class Image : public QObject class Image : public QObject
{ {
Q_OBJECT Q_OBJECT
@@ -17,8 +19,9 @@ class Image : public QObject
QPixmap m_pixmap; QPixmap m_pixmap;
QString m_name; QString m_name;
ImageInfoData m_info; ImageInfoData m_info;
ImageRingList *m_ringList;
public: public:
explicit Image(const QString name); explicit Image(const QString name, ImageRingList *ringList);
void load(); void load();
void release(); void release();
QString name() const; QString name() const;
@@ -43,6 +46,7 @@ class ImageRingList : public QObject
QList<ImagePtr>::iterator m_lastImage; QList<ImagePtr>::iterator m_lastImage;
QFileSystemWatcher m_fileSystemWatcher; QFileSystemWatcher m_fileSystemWatcher;
bool m_liveMode; bool m_liveMode;
bool m_calculateStats;
public: public:
explicit ImageRingList(QObject *parent = 0); explicit ImageRingList(QObject *parent = 0);
~ImageRingList(); ~ImageRingList();
@@ -52,6 +56,8 @@ public:
void increment(); void increment();
void decrement(); void decrement();
void setLiveMode(bool live); void setLiveMode(bool live);
void setCalculateStats(bool stats);
bool calculateStats() const;
protected: protected:
void setFiles(const QStringList files, const QString &currentFile = QString()); void setFiles(const QStringList files, const QString &currentFile = QString());
QList<ImagePtr>::iterator increment(QList<ImagePtr>::iterator iter); QList<ImagePtr>::iterator increment(QList<ImagePtr>::iterator iter);
+24 -11
View File
@@ -7,9 +7,10 @@
#include <fitsio2.h> #include <fitsio2.h>
#include "rawimage.h" #include "rawimage.h"
LoadRunable::LoadRunable(const QString &file, Image *receiver) : LoadRunable::LoadRunable(const QString &file, Image *receiver, bool stats) :
m_file(file), m_file(file),
m_receiver(receiver) m_receiver(receiver),
m_calculateStats(stats)
{ {
} }
@@ -57,7 +58,7 @@ bool loadRAW(QString path, ImageInfoData &info, RawImageAbs **image, QImage *qi
out[d++] = p; out[d++] = p;
} }
} }
*image = new RawImage<uint16_t>(w, h, out); *image = new RawImage<uint16_t>(rawdata.sizes.width, rawdata.sizes.height, out);
} }
if(qimage) if(qimage)
@@ -199,21 +200,19 @@ void LoadRunable::run()
QFileInfo finfo(m_file); QFileInfo finfo(m_file);
info.append(StringPair(QObject::tr("Filename"), finfo.fileName())); info.append(StringPair(QObject::tr("Filename"), finfo.fileName()));
QImage img;
RawImageAbs *rawImage = nullptr;
if(m_file.endsWith(".CR2", Qt::CaseInsensitive)) if(m_file.endsWith(".CR2", Qt::CaseInsensitive))
{ {
QImage img; loadRAW(m_file, info, m_calculateStats ? &rawImage : nullptr, &img);
loadRAW(m_file, info, nullptr, &img);
QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(QImage, img), Q_ARG(ImageInfoData, info));
} }
else if(m_file.endsWith(".FIT", Qt::CaseInsensitive)) else if(m_file.endsWith(".FIT", Qt::CaseInsensitive))
{ {
QImage img; loadFITS(m_file, info, m_calculateStats ? &rawImage : nullptr, &img);
if(loadFITS(m_file, info, nullptr, &img))
QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(QImage, img), Q_ARG(ImageInfoData, info));
} }
else else
{ {
QImage img(m_file); img = QImage(m_file);
ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData()); ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData());
info.append(StringPair(QObject::tr("Width"), QString::number(img.width()))); info.append(StringPair(QObject::tr("Width"), QString::number(img.width())));
info.append(StringPair(QObject::tr("Height"), QString::number(img.height()))); info.append(StringPair(QObject::tr("Height"), QString::number(img.height())));
@@ -221,7 +220,21 @@ void LoadRunable::run()
{ {
loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS);
loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE);
exif_data_free(exif);
} }
QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(QImage, img), Q_ARG(ImageInfoData, info));
} }
if(rawImage)
{
uint64_t mean, median, min, max;
double stdDev;
rawImage->imageStats(&mean, &stdDev, &median, &min, &max);
info.append(StringPair(QObject::tr("Mean"), QString::number(mean)));
info.append(StringPair(QObject::tr("Standart deviation"), QString::number(stdDev)));
info.append(StringPair(QObject::tr("Median"), QString::number(median)));
info.append(StringPair(QObject::tr("Minimum"), QString::number(min)));
info.append(StringPair(QObject::tr("Maximum"), QString::number(max)));
}
QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(QImage, img), Q_ARG(ImageInfoData, info));
} }
+2 -1
View File
@@ -10,8 +10,9 @@ class LoadRunable : public QRunnable
{ {
QString m_file; QString m_file;
Image *m_receiver; Image *m_receiver;
bool m_calculateStats;
public: public:
LoadRunable(const QString &file, Image *receiver); LoadRunable(const QString &file, Image *receiver, bool stats);
void run(); void run();
}; };
+12
View File
@@ -62,6 +62,13 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent),
selectMenu->addAction(tr("Unmark and next"), this, SLOT(unmarkAndNext()), Qt::Key_X); selectMenu->addAction(tr("Unmark and next"), this, SLOT(unmarkAndNext()), Qt::Key_X);
menuBar()->addMenu(selectMenu); menuBar()->addMenu(selectMenu);
QMenu *statsMenu = new QMenu(tr("Statistic"), this);
QAction *statsAction = new QAction(tr("Image statistics"), this);
statsAction->setCheckable(true);
connect(statsAction, SIGNAL(toggled(bool)), this, SLOT(imageStats(bool)));
statsMenu->addAction(statsAction);
menuBar()->addMenu(statsMenu);
m_database = new Database(this); m_database = new Database(this);
if(!m_database->init()) if(!m_database->init())
QMessageBox::critical(this, tr("Can't open DB"), tr("Can't open SQLITE database")); QMessageBox::critical(this, tr("Can't open DB"), tr("Can't open SQLITE database"));
@@ -240,6 +247,11 @@ void MainWindow::liveMode(bool active)
m_ringList->setLiveMode(active); m_ringList->setLiveMode(active);
} }
void MainWindow::imageStats(bool imageStats)
{
m_ringList->setCalculateStats(imageStats);
}
void MainWindow::updateWindowTitle() void MainWindow::updateWindowTitle()
{ {
ImagePtr ptr = m_ringList->currentImage(); ImagePtr ptr = m_ringList->currentImage();
+1
View File
@@ -38,6 +38,7 @@ protected slots:
void unmarkAndNext(); void unmarkAndNext();
void copyMarked(); void copyMarked();
void liveMode(bool active); void liveMode(bool active);
void imageStats(bool imageStats);
}; };
#endif // MAINWINDOW_H #endif // MAINWINDOW_H