Support for XISF

This commit is contained in:
2022-04-12 08:17:18 +02:00
parent e5cd25cc77
commit 0fb27266c7
278 changed files with 209068 additions and 7 deletions
+83 -3
View File
@@ -9,6 +9,7 @@
#include <iostream>
#include <libexif/exif-data.h>
#include <fitsio2.h>
#include <pcl/XISF.h>
#include "rawimage.h"
#include "starfit.h"
@@ -75,7 +76,7 @@ void printStarModel(int radius, const std::vector<double> &data, const Star &sta
std::cout << m.toStdString() << std::endl << std::endl;
}
bool loadRAW(QString path, ImageInfoData &info, RawImage **image)
bool loadRAW(const QString path, ImageInfoData &info, RawImage **image)
{
if(!image)
return false;
@@ -167,7 +168,7 @@ int loadFITSHeader(fitsfile *file, ImageInfoData &info)
return status;
}
bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
bool loadFITS(const QString path, ImageInfoData &info, RawImage **image)
{
if(!image)
return false;
@@ -210,6 +211,10 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
cvtype = CV_32F;
fitstype = TFLOAT;
break;
default:
info.info.append({QObject::tr("Error"), QObject::tr("Unsupported sample format")});
goto noload;
break;
}
size_t size = naxes[0]*naxes[1];
@@ -241,7 +246,7 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
}
}
}
noload:
loadFITSHeader(file, info);
fits_close_file(file, &status);
@@ -256,6 +261,77 @@ bool loadFITS(QString path, ImageInfoData &info, RawImage **image)
return true;
}
template<typename T, typename PCLtype, int CVtype>
bool loadPCLImage(pcl::XISFReader &xisf, RawImage **image)
{
PCLtype pclImage;
xisf.ReadImage(pclImage);
int numChannels = pclImage.NumberOfChannels();
cv::Mat cvImg[numChannels];
for(int i=0; i<numChannels; i++)
{
T *p = pclImage.PixelData(i);
cvImg[i].create(pclImage.Height(), pclImage.Width(), CVtype);
memcpy(cvImg[i].ptr(0), p, pclImage.Width()*pclImage.Height()*sizeof(T));
}
if(numChannels==3)
{
cv::Mat merged;
cv::merge(cvImg, 3, merged);
*image = new RawImage(merged);
return true;
}
if(numChannels==1)
{
*image = new RawImage(cvImg[0]);
return true;
}
return false;
}
bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image)
{
try
{
pcl::String pclPath = path.utf16();
pcl::XISFReader xisf;
xisf.Open(pclPath);
uint8_t bps = xisf.ImageOptions().bitsPerSample;
bool floatType = xisf.ImageOptions().ieeefpSampleFormat;
bool signedInt = xisf.ImageOptions().signedIntegers;
bool complex = xisf.ImageOptions().complexSample;
auto fitskeywords = xisf.ReadFITSKeywords();
for(auto fits : fitskeywords)
{
info.fitsHeader.append({fits.name.c_str(), fits.value.c_str(), fits.comment.c_str()});
}
if(floatType && bps == 32)
return loadPCLImage<float, pcl::FImage, CV_32F>(xisf, image);
if(!complex && !signedInt)
{
switch(bps)
{
case 8:
return loadPCLImage<uint8_t, pcl::UInt8Image, CV_8U>(xisf, image);
case 16:
return loadPCLImage<uint16_t, pcl::UInt16Image, CV_16U>(xisf, image);
}
}
}
catch (pcl::Error err)
{
info.info.append(QPair<QString, QString>("Error", err.FormatInfo().ToUTF8().c_str()));
qDebug() << err.FormatInfo().ToUTF8().c_str();
}
info.info.append({QObject::tr("Error"), QObject::tr("Unsupported sample format")});
return false;
}
void LoadRunable::run()
{
if(!m_receiver->isCurrent())
@@ -280,6 +356,10 @@ void LoadRunable::run()
{
loadFITS(m_file, info, &rawImage);
}
else if(m_file.endsWith(".XISF", Qt::CaseInsensitive))
{
loadXISF(m_file, info, &rawImage);
}
else
{
QImage img(m_file);