Getting rid of opencv

This commit is contained in:
2023-06-16 23:31:20 +02:00
parent ab245f0484
commit 31cf1ee2b1
5 changed files with 487 additions and 363 deletions
+69 -86
View File
@@ -115,7 +115,7 @@ bool loadRAW(const QString path, ImageInfoData &info, RawImage **image)
out[d++] = p;
}
}
*image = new RawImage(rawdata.sizes.width, rawdata.sizes.height, RawImage::UINT16);
*image = new RawImage(rawdata.sizes.width, rawdata.sizes.height, 1, RawImage::UINT16);
memcpy((*image)->data(), &out[0], sizeof(uint16_t)*d);
}
@@ -212,28 +212,35 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image)
if(naxis >= 2 && naxis <= 3 && status == 0)
{
int cvtype;
RawImage::DataType type;
int fitstype;
std::vector<cv::Mat> cvimg;
long fpixel[3] = {1,1,1};
switch(imgtype)
{
case BYTE_IMG:
cvtype = CV_8U;
type = RawImage::UINT8;
fitstype = TBYTE;
break;
case SHORT_IMG:
cvtype = CV_16S;
type = RawImage::UINT16;
fitstype = TSHORT;
break;
case USHORT_IMG:
cvtype = CV_16U;
type = RawImage::UINT16;
fitstype = TUSHORT;
break;
case ULONG_IMG:
type = RawImage::UINT32;
fitstype = TUINT;
break;
case FLOAT_IMG:
cvtype = CV_32F;
type = RawImage::FLOAT32;
fitstype = TFLOAT;
break;
case DOUBLE_IMG:
type = RawImage::FLOAT64;
fitstype = TDOUBLE;
break;
default:
info.info.append({QObject::tr("Error"), QObject::tr("Unsupported sample format")});
goto noload;
@@ -247,26 +254,28 @@ bool loadFITS(const QString path, ImageInfoData &info, RawImage **image)
info.info.append({QObject::tr("Width"), QString::number(naxes[0])});
info.info.append({QObject::tr("Height"), QString::number(naxes[1])});
RawImage img(w, h, naxis == 2 ? 1 : naxes[2], type);
uint8_t *data = static_cast<uint8_t*>(img.data());
for (int i=1; i==1 || i<=naxes[2]; i++)
{
cv::Mat tmp(h, w, cvtype);
fpixel[2] = i;
fits_read_pix(file, fitstype, fpixel, size, NULL, tmp.ptr(), NULL, &status);
if(cvtype == CV_16S)
tmp.convertTo(tmp, CV_16U, 1, 32767);
cvimg.push_back(tmp);
fits_read_pix(file, fitstype, fpixel, size, NULL, data + img.size() * RawImage::typeSize(type) * (i-1), NULL, &status);
}
if(fitstype == TSHORT)
{
uint16_t *s = static_cast<uint16_t*>(img.data());
size_t size = img.size() * img.channels();
for(size_t i=0; i<size; i++)
s[i] -= INT16_MIN;
}
if(cvimg.size() == 1)
{
*image = new RawImage(cvimg[0]);
}
if(cvimg.size() == 3)
{
cv::Mat rgb;
cv::merge(cvimg, rgb);
*image = new RawImage(rgb);
}
if(img.channels() == 1)
*image = new RawImage(std::move(img));
else
*image = RawImage::fromPlanar(img);
if(*image)
(*image)->convertToGLFormat();
}
}
noload:
@@ -310,51 +319,33 @@ bool loadXISF(const QString &path, ImageInfoData &info, RawImage **image)
info.info.append({QObject::tr("Height"), QString::number(xisfImage.height())});
if(!info.wcs->valid())info.wcs.reset();
RawImage::DataType type;
switch(xisfImage.sampleFormat())
{
case LibXISF::Image::UInt8: type = RawImage::UINT8; break;
case LibXISF::Image::UInt16: type = RawImage::UINT16; break;
case LibXISF::Image::UInt32: type = RawImage::UINT32; break;
case LibXISF::Image::Float32: type = RawImage::FLOAT32; break;
case LibXISF::Image::Float64: type = RawImage::FLOAT64; break;
default: break;
}
if(xisfImage.channelCount() == 1)
{
switch(xisfImage.sampleFormat())
{
case LibXISF::Image::UInt8:
*image = new RawImage(xisfImage.width(), xisfImage.height(), RawImage::UINT8);
std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize());
break;
case LibXISF::Image::UInt16:
*image = new RawImage(xisfImage.width(), xisfImage.height(), RawImage::UINT16);
std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize());
break;
case LibXISF::Image::Float32:
*image = new RawImage(xisfImage.width(), xisfImage.height(), RawImage::FLOAT32);
std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize());
break;
default:
break;
}
*image = new RawImage(xisfImage.width(), xisfImage.height(), 1, type);
std::memcpy((*image)->data(), xisfImage.imageData(), xisfImage.imageDataSize());
}
else if(xisfImage.channelCount() == 3)
else if(xisfImage.channelCount() == 3 || xisfImage.channelCount() == 4)
{
LibXISF::Image tmpImage = xisfImage;
tmpImage.convertPixelStorageTo(LibXISF::Image::Normal);
switch(tmpImage.sampleFormat())
{
case LibXISF::Image::UInt8:
*image = new RawImage(tmpImage.width(), tmpImage.height(), RawImage::UINT8C3);
std::memcpy((*image)->data(), tmpImage.imageData(), tmpImage.imageDataSize());
break;
case LibXISF::Image::UInt16:
*image = new RawImage(tmpImage.width(), tmpImage.height(), RawImage::UINT16C3);
std::memcpy((*image)->data(), tmpImage.imageData(), tmpImage.imageDataSize());
break;
case LibXISF::Image::Float32:
*image = new RawImage(tmpImage.width(), tmpImage.height(), RawImage::FLOAT32C3);
std::memcpy((*image)->data(), tmpImage.imageData(), tmpImage.imageDataSize());
break;
default:
break;
}
tmpImage.convertPixelStorageTo(LibXISF::Image::Planar);
*image = RawImage::fromPlanar(tmpImage.imageData(), tmpImage.width(), tmpImage.height(), tmpImage.channelCount(), type);
}
if(*image)
{
(*image)->convertToGLFormat();
return true;
}
}
catch (LibXISF::Error &err)
{
@@ -439,11 +430,7 @@ void LoadRunable::run()
if(m_analyzeLevel >= Peaks)
{
std::vector<Peak> peaks;
if(raw) {
rawImage->quarter();
qDebug() << "quarter" << timer.restart();
}
RawImage *medianImage = rawImage->medianFilter();
/*RawImage *medianImage = rawImage->medianFilter();
qDebug() << "median" << timer.restart();
int numPeaks = medianImage->findPeaks(median+stdDev*2, 20, peaks);
delete medianImage;
@@ -483,7 +470,7 @@ void LoadRunable::run()
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();
qDebug() << "Star fit" << timer.restart();*/
}
}
@@ -498,10 +485,6 @@ void LoadRunable::run()
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();
@@ -566,40 +549,40 @@ void writeFITSImage(fitsfile *fw, RawImage *rawimage, ImageInfoData &imageinfo)
int status = 0;
long firstpix[3] = {1,1,1};
int channels = rawimage->mat().channels();
int channels = rawimage->channels();
int naxis = channels == 1 ? 2 : 3;
long naxes[3] = {(int)rawimage->width(), (int)rawimage->height(), rawimage->mat().channels()};
long naxes[3] = {(int)rawimage->width(), (int)rawimage->height(), rawimage->channels()};
std::vector<cv::Mat> mat;
std::vector<RawImage> planes;
if(channels == 1)
mat.push_back(rawimage->mat());
planes.push_back(*rawimage);
else
cv::split(rawimage->mat(), mat);
planes = rawimage->split();
switch(CV_MAT_DEPTH(rawimage->dataType()))
switch(rawimage->type())
{
case CV_8U:
case RawImage::UINT8:
fits_create_img(fw, BYTE_IMG, naxis, naxes, &status);
for(int i=0; i<channels; i++)
{
firstpix[2] = i+1;
fits_write_pix(fw, TBYTE, firstpix, rawimage->size(), mat[i].data, &status);
fits_write_pix(fw, TBYTE, firstpix, rawimage->size(), planes[i].data(), &status);
}
break;
case CV_16U:
case RawImage::UINT16:
fits_create_img(fw, USHORT_IMG, naxis, naxes, &status);
for(int i=0; i<channels; i++)
{
firstpix[2] = i+1;
fits_write_pix(fw, TUSHORT, firstpix, rawimage->size(), mat[i].data, &status);
fits_write_pix(fw, TUSHORT, firstpix, rawimage->size(), planes[i].data(), &status);
}
break;
case CV_32F:
case RawImage::FLOAT32:
fits_create_img(fw, FLOAT_IMG, naxis, naxes, &status);
for(int i=0; i<channels; i++)
{
firstpix[2] = i+1;
fits_write_pix(fw, TFLOAT, firstpix, rawimage->size(), mat[i].data, &status);
fits_write_pix(fw, TFLOAT, firstpix, rawimage->size(), planes[i].data(), &status);
}
break;
}
@@ -645,13 +628,13 @@ void ConvertRunable::run()
try
{
LibXISF::XISFWriter xisf;
int channelCount = rawimage->mat().channels();
int channelCount = rawimage->channels();
LibXISF::Image::SampleFormat sampleFormat;
switch(CV_MAT_DEPTH(rawimage->dataType()))
switch(rawimage->type())
{
case CV_8U: sampleFormat = LibXISF::Image::UInt8; break;
case CV_16U: sampleFormat = LibXISF::Image::UInt16; break;
case CV_32F: sampleFormat = LibXISF::Image::Float32; break;
case RawImage::UINT8: sampleFormat = LibXISF::Image::UInt8; break;
case RawImage::UINT16: sampleFormat = LibXISF::Image::UInt16; break;
case RawImage::FLOAT32: sampleFormat = LibXISF::Image::Float32; break;
default: return;
}