Support for XISF
This commit is contained in:
+83
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user