From abc813ddbb5a96a26f4762ba3b9b77dd3d59f87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sun, 1 Jan 2023 19:04:23 +0100 Subject: [PATCH] Fix exceptions and errors in analyzing code --- loadrunable.cpp | 238 +++++++++++++++++++++++++----------------------- rawimage.cpp | 11 ++- starfit.cpp | 12 +-- 3 files changed, 135 insertions(+), 126 deletions(-) diff --git a/loadrunable.cpp b/loadrunable.cpp index 0e2eb46..d25324c 100644 --- a/loadrunable.cpp +++ b/loadrunable.cpp @@ -384,135 +384,143 @@ bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image) void LoadRunable::run() { - if(!m_thumbnail && !m_receiver->isCurrent()) + try { - return; - } - QElapsedTimer timer; - ImageInfoData info; - QFileInfo finfo(m_file); - info.info.append({QObject::tr("Filename"), finfo.fileName()}); - RawImage *rawImage = nullptr; - bool raw = false; - timer.start(); - if(m_file.endsWith(".CR2", Qt::CaseInsensitive) || m_file.endsWith(".NEF", Qt::CaseInsensitive) || m_file.endsWith(".DNG", Qt::CaseInsensitive)) - { - loadRAW(m_file, info, &rawImage); - raw = true; - qDebug() << "LoadRAW" << timer.elapsed(); - } - else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive)) - { - loadFITS(m_file, info, &rawImage); - qDebug() << "LoadFITS" << timer.elapsed(); - } - else if(m_file.endsWith(".XISF", Qt::CaseInsensitive)) - { - loadXISF(m_file, info, &rawImage); - qDebug() << "LoadXISF" << timer.elapsed(); - } - else - { - QImage img(m_file); -#ifdef COLOR_MANAGMENT - if(img.colorSpace().isValid() && img.colorSpace() != QColorSpace::SRgb) - img.convertToColorSpace(QColorSpace::SRgb); -#endif - - ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData()); - info.info.append({QObject::tr("Width"), QString::number(img.width())}); - info.info.append({QObject::tr("Height"), QString::number(img.height())}); - if(exif) + if(!m_thumbnail && !m_receiver->isCurrent()) { - loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); - loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); - exif_data_free(exif); + return; } - rawImage = new RawImage(img); - } + QElapsedTimer timer; + ImageInfoData info; + QFileInfo finfo(m_file); + info.info.append({QObject::tr("Filename"), finfo.fileName()}); - if(rawImage && m_analyzeLevel >= Statistics && !m_thumbnail) - { - double mean, median, min, max, mad; - double stdDev; - uint32_t saturated; + RawImage *rawImage = nullptr; + bool raw = false; timer.start(); - rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad, &saturated); - qDebug() << "image stats" << timer.restart(); - info.info.append({QObject::tr("Mean"), QString::number(mean)}); - info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)}); - info.info.append({QObject::tr("Median"), QString::number(median)}); - info.info.append({QObject::tr("Minimum"), QString::number(min)}); - info.info.append({QObject::tr("Maximum"), QString::number(max)}); - info.info.append({QObject::tr("MAD"), QString::number(mad)}); - info.info.append({QObject::tr("Saturated"), QString::number(100.0 * saturated / rawImage->size()) + "%"}); - - if(m_analyzeLevel >= Peaks) + if(m_file.endsWith(".CR2", Qt::CaseInsensitive) || m_file.endsWith(".NEF", Qt::CaseInsensitive) || m_file.endsWith(".DNG", Qt::CaseInsensitive)) { - std::vector peaks; - if(raw) { - rawImage->quarter(); - qDebug() << "quarter" << timer.restart(); - } - RawImage *medianImage = rawImage->medianFilter(); - qDebug() << "median" << timer.restart(); - int numPeaks = medianImage->findPeaks(median+stdDev*2, 20, peaks); - delete medianImage; - qDebug() << "peaks" << timer.restart(); - //if(m_analyzeLevel == Peaks) - // drawPeaks(img, peaks); - qDebug() << "draw peaks" << timer.restart(); - info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)}); - //info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())}); - - if(m_analyzeLevel>= Stars) - { - double fwhmX = 0; - double fwhmY = 0; - const int radius = 13; - StarFit starFit(radius); - std::vector stars; - for(uint i=0; i r; - int x = p.x(); - int y = p.y(); - rawImage->rect(x, y, radius, radius, r); - Star star = starFit.fitStar(r, false); - if(star.valid()) - { - //printStarModel(radius, r, star); - star.m_x += x; - star.m_y += y; - fwhmX += star.fwhmX(); - fwhmY += star.fwhmY(); - stars.push_back(star); - } - } - //drawStars(img, stars); - info.info.append({QObject::tr("FWHM X"), QString::number(fwhmX/stars.size())}); - info.info.append({QObject::tr("FWHM Y"), QString::number(fwhmY/stars.size())}); - } - qDebug() << "Star fit" << timer.restart(); + loadRAW(m_file, info, &rawImage); + raw = true; + qDebug() << "LoadRAW" << timer.elapsed(); } - } - - if(m_thumbnail) - { - if(rawImage) + else if(m_file.endsWith(".FIT", Qt::CaseInsensitive) || m_file.endsWith(".FITS", Qt::CaseInsensitive)) { - rawImage->convertToThumbnail(); - QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(void*, rawImage)); + loadFITS(m_file, info, &rawImage); + qDebug() << "LoadFITS" << timer.elapsed(); + } + else if(m_file.endsWith(".XISF", Qt::CaseInsensitive)) + { + loadXISF(m_file, info, &rawImage); + qDebug() << "LoadXISF" << timer.elapsed(); } else { - qDebug() << "failed"; + QImage img(m_file); + #ifdef COLOR_MANAGMENT + if(img.colorSpace().isValid() && img.colorSpace() != QColorSpace::SRgb) + img.convertToColorSpace(QColorSpace::SRgb); + #endif + + ExifData *exif = exif_data_new_from_file(m_file.toLocal8Bit().constData()); + info.info.append({QObject::tr("Width"), QString::number(img.width())}); + info.info.append({QObject::tr("Height"), QString::number(img.height())}); + if(exif) + { + loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); + loadExifEntry(info, exif->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); + exif_data_free(exif); + } + rawImage = new RawImage(img); } + + if(rawImage && m_analyzeLevel >= Statistics && !m_thumbnail) + { + double mean, median, min, max, mad; + double stdDev; + uint32_t saturated; + timer.start(); + rawImage->imageStats(&mean, &stdDev, &median, &min, &max, &mad, &saturated); + qDebug() << "image stats" << timer.restart(); + info.info.append({QObject::tr("Mean"), QString::number(mean)}); + info.info.append({QObject::tr("Standart deviation"), QString::number(stdDev)}); + info.info.append({QObject::tr("Median"), QString::number(median)}); + info.info.append({QObject::tr("Minimum"), QString::number(min)}); + info.info.append({QObject::tr("Maximum"), QString::number(max)}); + info.info.append({QObject::tr("MAD"), QString::number(mad)}); + info.info.append({QObject::tr("Saturated"), QString::number(100.0 * saturated / rawImage->size()) + "%"}); + + if(m_analyzeLevel >= Peaks) + { + std::vector peaks; + if(raw) { + rawImage->quarter(); + qDebug() << "quarter" << timer.restart(); + } + RawImage *medianImage = rawImage->medianFilter(); + qDebug() << "median" << timer.restart(); + int numPeaks = medianImage->findPeaks(median+stdDev*2, 20, peaks); + delete medianImage; + qDebug() << "peaks" << timer.restart(); + //if(m_analyzeLevel == Peaks) + // drawPeaks(img, peaks); + qDebug() << "draw peaks" << timer.restart(); + info.info.append({QObject::tr("Peaks"), QString::number(numPeaks)}); + //info.info.append({QObject::tr("Peaks draw"), QString::number(peaks.size())}); + + if(m_analyzeLevel>= Stars) + { + double fwhmX = 0; + double fwhmY = 0; + const int radius = 13; + StarFit starFit(radius); + std::vector stars; + for(uint i=0; i r; + int x = p.x(); + int y = p.y(); + rawImage->rect(x, y, radius, radius, r); + Star star = starFit.fitStar(r, false); + if(star.valid()) + { + //printStarModel(radius, r, star); + star.m_x += x; + star.m_y += y; + fwhmX += star.fwhmX(); + fwhmY += star.fwhmY(); + stars.push_back(star); + } + } + //drawStars(img, stars); + info.info.append({QObject::tr("FWHM X"), QString::number(fwhmX/stars.size())}); + info.info.append({QObject::tr("FWHM Y"), QString::number(fwhmY/stars.size())}); + } + qDebug() << "Star fit" << timer.restart(); + } + } + + if(m_thumbnail) + { + if(rawImage) + { + rawImage->convertToThumbnail(); + QMetaObject::invokeMethod(m_receiver, "thumbnailLoadFinish", Qt::QueuedConnection, Q_ARG(void*, rawImage)); + } + } + else + QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(void*, rawImage), Q_ARG(ImageInfoData, info)); + } + catch(cv::Exception e) + { + qDebug() << e.what(); + } + catch(std::exception e) + { + qDebug() << e.what(); } - else - QMetaObject::invokeMethod(m_receiver, "imageLoaded", Qt::QueuedConnection, Q_ARG(void*, rawImage), Q_ARG(ImageInfoData, info)); } bool readFITSHeader(const QString &path, ImageInfoData &info) diff --git a/rawimage.cpp b/rawimage.cpp index ee969f5..8fc4e4a 100644 --- a/rawimage.cpp +++ b/rawimage.cpp @@ -224,10 +224,13 @@ int RawImage::findPeaks(double background, double distance, std::vector &p cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(distance, distance)); - cv::Mat mask, dilate, locMax, result; - cv::dilate(m_img, dilate, kernel); - cv::compare(m_img, dilate, locMax, cv::CMP_GE); - cv::compare(m_img, cv::Scalar(background), mask, cv::CMP_GT); + cv::Mat img, mask, dilate, locMax, result; + if(m_img.channels() == 1)img = m_img; + else cv::cvtColor(m_img, img, cv::COLOR_RGB2GRAY); + + cv::dilate(img, dilate, kernel); + cv::compare(img, dilate, locMax, cv::CMP_GE); + cv::compare(img, cv::Scalar(background), mask, cv::CMP_GT); cv::bitwise_and(locMax, mask, result); cv::findContours(result, contours, cv::noArray(), cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); diff --git a/starfit.cpp b/starfit.cpp index 2cffabe..e251374 100644 --- a/starfit.cpp +++ b/starfit.cpp @@ -237,6 +237,8 @@ StarFit::StarFit(int size) m_fdf_an.fvv = nullptr; m_fdf_an.n = size*size; m_fdf_an.p = 6;//number of model parameters amplitude, x, y, sigma_x, sigma_y, angle + + gsl_set_error_handler_off(); } StarFit::~StarFit() @@ -272,14 +274,10 @@ Star StarFit::fitStar(const std::vector &data, bool angle) gsl_multifit_nlinear_workspace *workspace = gsl_multifit_nlinear_alloc(gsl_multifit_nlinear_trust, &m_fdf_params, fdf->n, fdf->p); - gsl_multifit_nlinear_init(start, fdf, workspace); - gsl_vector *f = gsl_multifit_nlinear_residual(workspace); + int ret = gsl_multifit_nlinear_init(start, fdf, workspace); + if(ret)return star; - double cost, cost0; - gsl_blas_ddot(f, f, &cost0); - int ret = gsl_multifit_nlinear_driver(MAX_ITER, TOL, TOL, TOL, nullptr, nullptr, &info, workspace); - - gsl_blas_ddot(f, f, &cost); + ret = gsl_multifit_nlinear_driver(MAX_ITER, TOL, TOL, TOL, nullptr, nullptr, &info, workspace); if(ret==0) {