Fix error in starfit model, preparation for angled version
This commit is contained in:
+65
-3
@@ -6,9 +6,11 @@
|
||||
#include <QPainter>
|
||||
#include <QElapsedTimer>
|
||||
#include <QDebug>
|
||||
#include <iostream>
|
||||
#include <libexif/exif-data.h>
|
||||
#include <fitsio2.h>
|
||||
#include "rawimage.h"
|
||||
#include "starfit.h"
|
||||
|
||||
LoadRunable::LoadRunable(const QString &file, Image *receiver, AnalyzeLevel level) :
|
||||
m_file(file),
|
||||
@@ -40,6 +42,39 @@ void drawPeaks(QImage &img, const std::vector<Peak> &peaks)
|
||||
img = pix.toImage();
|
||||
}
|
||||
|
||||
void drawStars(QImage &img, const std::vector<Star> &stars)
|
||||
{
|
||||
QPixmap pix = QPixmap::fromImage(img);
|
||||
QPainter painter(&pix);
|
||||
painter.setPen(Qt::red);
|
||||
for(auto star : stars)
|
||||
{
|
||||
painter.drawEllipse(QPointF(star.m_x, star.m_y), star.m_sx, star.m_sy);
|
||||
}
|
||||
img = pix.toImage();
|
||||
}
|
||||
|
||||
void printStarModel(int radius, const std::vector<double> &data, const Star &star)
|
||||
{
|
||||
QString d = "d=[";
|
||||
QString m = "m=[";
|
||||
for(int y=0; y<radius; y++)
|
||||
{
|
||||
for(int x=0; x<radius; x++)
|
||||
{
|
||||
d += QString::number(data[y*radius+x]) + ",";
|
||||
m += QString::number(gauss_model(star.m_am, star.m_x, star.m_y, star.m_sx, star.m_sy, x, y)) + ",";
|
||||
}
|
||||
d += ";";
|
||||
m += ";";
|
||||
}
|
||||
d += "];";
|
||||
m += "];";
|
||||
//std::cout << star.m_am << " " << star.m_sx << star.m_sy << std::endl;
|
||||
std::cout << d.toStdString() << std::endl;
|
||||
std::cout << m.toStdString() << std::endl << std::endl;
|
||||
}
|
||||
|
||||
bool loadRAW(QString path, ImageInfoData &info, RawImageAbs **image, QImage *qimage)
|
||||
{
|
||||
if(!image && !qimage)
|
||||
@@ -271,14 +306,41 @@ void LoadRunable::run()
|
||||
rawImage->quarter();
|
||||
qDebug() << "quarter" << timer.restart();
|
||||
}
|
||||
rawImage->medianFilter();
|
||||
RawImageAbs *medianImage = rawImage->medianFilter();
|
||||
qDebug() << "median" << timer.restart();
|
||||
int numPeaks = rawImage->findPeaks(median+stdDev, 20, peaks);
|
||||
int numPeaks = medianImage->findPeaks(median+stdDev, 20, peaks);
|
||||
delete medianImage;
|
||||
qDebug() << "peaks" << timer.restart();
|
||||
drawPeaks(img, peaks);
|
||||
if(m_analyzeLevel == Peaks)
|
||||
drawPeaks(img, peaks);
|
||||
qDebug() << "draw peaks" << timer.restart();
|
||||
info.append(StringPair(QObject::tr("Peaks"), QString::number(numPeaks)));
|
||||
info.append(StringPair(QObject::tr("Peaks draw"), QString::number(peaks.size())));
|
||||
|
||||
if(m_analyzeLevel>= Stars)
|
||||
{
|
||||
const int radius = 13;
|
||||
StarFit starFit(radius);
|
||||
std::vector<Star> stars;
|
||||
for(uint i=0; i<peaks.size(); i++)
|
||||
{
|
||||
Peak p = peaks[i];
|
||||
std::vector<double> 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;
|
||||
stars.push_back(star);
|
||||
}
|
||||
}
|
||||
drawStars(img, stars);
|
||||
}
|
||||
qDebug() << "Star fit" << timer.restart();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user