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
+65 -68
View File
@@ -12,47 +12,48 @@
#include <QPainter>
#include <QFileInfo>
#include <cmath>
#include <QElapsedTimer>
struct RawImageType
{
QOpenGLTexture::PixelFormat pixelFormat;
QOpenGLTexture::TextureFormat textureFormat;
QOpenGLTexture::PixelType dataType;
bool bw;
};
const RawImageType rawImageTypes[] = {
{QOpenGLTexture::Red, QOpenGLTexture::R8_UNorm, QOpenGLTexture::UInt8, true},
{QOpenGLTexture::Red, QOpenGLTexture::R16_UNorm, QOpenGLTexture::UInt16, true},
{QOpenGLTexture::Red, QOpenGLTexture::R32F, QOpenGLTexture::Float32, true},
#ifdef COLOR_MANAGMENT
{QOpenGLTexture::RGB, QOpenGLTexture::SRGB8, QOpenGLTexture::UInt8, false},
{QOpenGLTexture::RGBA,QOpenGLTexture::SRGB8_Alpha8, QOpenGLTexture::UInt8, false},
#else
{QOpenGLTexture::RGB, QOpenGLTexture::RGB8_UNorm, QOpenGLTexture::UInt8, false},
{QOpenGLTexture::RGBA,QOpenGLTexture::RGBA8_UNorm, QOpenGLTexture::UInt8, false},
#endif
{QOpenGLTexture::RGB, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
{QOpenGLTexture::RGBA, QOpenGLTexture::RGB16_UNorm, QOpenGLTexture::UInt16, false},
{QOpenGLTexture::RGB, QOpenGLTexture::RGB32F, QOpenGLTexture::Float32, false}
};
static bool MANUAL_MIPMAP_GEN = false;
void setScrollRange(QScrollBar *scrollBar, int newRange)
RawImageType getRawImageType(const RawImage *img)
{
int page = scrollBar->pageStep();
int pos = scrollBar->value() + page/2;
int range = scrollBar->maximum() + page;
float relPos = (float)pos/(float)range;
RawImageType type;
switch(img->type())
{
case RawImage::UINT8:
if(img->channels() >= 3)
type.textureFormat = QOpenGLTexture::SRGB8_Alpha8;
else
type.textureFormat = QOpenGLTexture::R8_UNorm;
type.dataType = QOpenGLTexture::UInt8;
break;
case RawImage::UINT16:
if(img->channels() >= 3)
type.textureFormat = QOpenGLTexture::RGBA16_UNorm;
else
type.textureFormat = QOpenGLTexture::R16_UNorm;
type.dataType = QOpenGLTexture::UInt16;
break;
case RawImage::FLOAT32:
if(img->channels() >= 3)
type.textureFormat = QOpenGLTexture::RGBA32F;
else
type.textureFormat = QOpenGLTexture::R32F;
type.dataType = QOpenGLTexture::Float32;
}
if(page >= newRange)
scrollBar->hide();
if(img->channels() >= 3)
type.pixelFormat = QOpenGLTexture::RGBA;
else
scrollBar->show();
type.pixelFormat = QOpenGLTexture::Red;
scrollBar->setRange(0, newRange - page);
scrollBar->setValue(relPos*newRange - page/2);
return type;
}
ImageWidget::ImageWidget(Database *database, QWidget *parent) : QOpenGLWidget(parent)
@@ -108,10 +109,12 @@ void ImageWidget::setImage(std::shared_ptr<RawImage> image, int index)
if(!m_image)return;
const RawImageType &rawImageType = rawImageTypes[image->type()];
m_srgb = rawImageType.textureFormat == QOpenGLTexture::SRGB8 || rawImageType.textureFormat == QOpenGLTexture::SRGB8_Alpha8;
m_bwImg = rawImageType.bw;
RawImageType rawImageType = getRawImageType(image.get());
m_srgb = rawImageType.textureFormat == QOpenGLTexture::SRGB8_Alpha8;
m_bwImg = image->channels() == 1;
QElapsedTimer timer;
timer.start();
m_image->destroy();
m_image->setAutoMipMapGenerationEnabled(false);
m_image->setFormat(rawImageType.textureFormat);
@@ -122,40 +125,33 @@ void ImageWidget::setImage(std::shared_ptr<RawImage> image, int index)
m_image->setWrapMode(QOpenGLTexture::ClampToEdge);
m_image->setBorderColor(0, 0, 0, 0);
m_image->setData(0, rawImageType.pixelFormat, rawImageType.dataType, (const void*)image->data(), m_transferOptions.get());
m_image->generateMipMaps();
qDebug() << "setImage" << timer.elapsed();
auto sRGB_linear = [](cv::Point3f &pixel, const int *pos)
/*QElapsedTimer timer;
RawImage xxx(8192, 8192, 4, RawImage::UINT32);
uint32_t *p = (uint32_t*)xxx.data();
for(int i=0; i<8192*8192*4; i++)
p[i] = rand();
auto test = [&](QOpenGLTexture::PixelFormat format)
{
pixel.x = pixel.x <= 0.04045f ? pixel.x / 12.92f : std::pow((pixel.x + 0.055) / 1.055f, 2.4f);
pixel.y = pixel.y <= 0.04045f ? pixel.y / 12.92f : std::pow((pixel.y + 0.055) / 1.055f, 2.4f);
pixel.z = pixel.z <= 0.04045f ? pixel.z / 12.92f : std::pow((pixel.z + 0.055) / 1.055f, 2.4f);
timer.start();
m_image->destroy();
//m_image->setAutoMipMapGenerationEnabled(false);
m_image->setFormat(QOpenGLTexture::TextureFormat::RGBA8_UNorm);
m_image->setSize(8192, 8192);
//m_image->setMipLevels([&](){ int c = 0; int s = std::min(m_imgWidth, m_imgHeight); while(s>>=1)c++; return c; }());
m_image->allocateStorage();
m_image->setMinMagFilters(QOpenGLTexture::LinearMipMapLinear, QOpenGLTexture::Linear);
m_image->setWrapMode(QOpenGLTexture::ClampToEdge);
m_image->setBorderColor(0, 0, 0, 0);
m_image->setData(0, format, QOpenGLTexture::UInt8, (const void*)p, m_transferOptions.get());
qDebug() << format << timer.elapsed();
};
auto linear_sRGB = [](cv::Point3f &pixel, const int *pos)
{
pixel.x = pixel.x <= 0.0031308f ? pixel.x * 12.92f : 1.055f * std::pow(pixel.x , 1/2.4f) - 0.055f;
pixel.y = pixel.y <= 0.0031308f ? pixel.y * 12.92f : 1.055f * std::pow(pixel.y , 1/2.4f) - 0.055f;
pixel.z = pixel.z <= 0.0031308f ? pixel.z * 12.92f : 1.055f * std::pow(pixel.z , 1/2.4f) - 0.055f;
};
//AMD OpenGL driver on Windows doesn't generate mipmaps for sRGB textures correctly
if(m_srgb && MANUAL_MIPMAP_GEN)
{
cv::Mat img = image->mat();
img.convertTo(img, CV_32FC3, 1/255.0);
img.forEach<cv::Point3f>(sRGB_linear);
cv::Size size(img.cols, img.rows);
for(int i=1; i<m_image->mipLevels(); i++)
{
cv::Mat mip;
size /= 2;
cv::resize(img, mip, size);
mip.copyTo(img);
mip.forEach<cv::Point3f>(linear_sRGB);
mip.convertTo(mip, CV_8UC3, 255);
m_image->setData(i, rawImageType.pixelFormat, rawImageType.dataType, (const void*)mip.ptr(), m_transferOptions.get());
}
}
else m_image->generateMipMaps();
test(QOpenGLTexture::PixelFormat::BGR);
test(QOpenGLTexture::PixelFormat::RGB);
test(QOpenGLTexture::PixelFormat::BGRA);
test(QOpenGLTexture::PixelFormat::RGBA);*/
if(m_debayerTex)
{
@@ -308,7 +304,8 @@ void ImageWidget::thumbnailLoaded(const Image *image)
{
makeCurrent();
const RawImage *raw = image->thumbnail();
m_thumbnailTexture->setData(0, image->number(), QOpenGLTexture::RGB, QOpenGLTexture::UInt16, raw->data(), m_transferOptions.get());
if(!raw)return;
m_thumbnailTexture->setData(0, image->number(), QOpenGLTexture::RGBA, QOpenGLTexture::UInt16, raw->data(), m_transferOptions.get());
float a = raw->thumbAspect();
int sizes[3] = { std::max(1, a > 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE * a)), std::max(1, a < 1.0f ? THUMB_SIZE : (int)(THUMB_SIZE / a)), image->number() };
m_sizesDirty = true;
@@ -612,7 +609,7 @@ void ImageWidget::mouseMoveEvent(QMouseEvent *event)
if(!m_showThumbnails && m_rawImage)
{
QVector2D pix = getImagePixelCoord(QVector2D(event->pos()));
QVector3D rgb;
double r,g,b;
SkyPoint sky;
if(m_wcs)
@@ -620,12 +617,12 @@ void ImageWidget::mouseMoveEvent(QMouseEvent *event)
m_wcs->pixelToWorld(QPointF(pix.x(), pix.y()), sky);
}
if(m_rawImage->pixel(pix.x(), pix.y(), rgb))
if(m_rawImage->pixel(pix.x(), pix.y(), r, g, b))
{
if(m_bwImg)
emit status(tr("L:%1").arg(rgb.x()), tr("X:%3 Y:%4").arg((int)pix.x()).arg((int)pix.y()), sky.toString());
emit status(tr("L:%1").arg(r), tr("X:%3 Y:%4").arg((int)pix.x()).arg((int)pix.y()), sky.toString());
else
emit status(tr("R:%1 G:%2 B:%3").arg(rgb.x()).arg(rgb.y()).arg(rgb.z()), tr("X:%3 Y:%4").arg((int)pix.x()).arg((int)pix.y()), sky.toString());
emit status(tr("R:%1 G:%2 B:%3").arg(r).arg(g).arg(b), tr("X:%3 Y:%4").arg((int)pix.x()).arg((int)pix.y()), sky.toString());
}
}
}