Getting rid of opencv
This commit is contained in:
+308
-178
@@ -1,142 +1,129 @@
|
||||
#include "rawimage.h"
|
||||
#include <QDebug>
|
||||
#include <cstring>
|
||||
|
||||
int THUMB_SIZE = 128;
|
||||
int THUMB_SIZE_BORDER = 138;
|
||||
int THUMB_SIZE_BORDER_Y = 158;
|
||||
double SATURATION = 0.95;
|
||||
|
||||
RawImage::ImgType CV2Type(int cvtype)
|
||||
size_t RawImage::typeSize(RawImage::DataType type)
|
||||
{
|
||||
switch (cvtype)
|
||||
switch(type)
|
||||
{
|
||||
case CV_8U:
|
||||
return RawImage::UINT8;
|
||||
case CV_16U:
|
||||
return RawImage::UINT16;
|
||||
case CV_32F:
|
||||
return RawImage::FLOAT32;
|
||||
case CV_8UC3:
|
||||
return RawImage::UINT8C3;
|
||||
case CV_8UC4:
|
||||
return RawImage::UINT8C4;
|
||||
case CV_16UC3:
|
||||
return RawImage::UINT16C3;
|
||||
case CV_16UC4:
|
||||
return RawImage::UINT16C4;
|
||||
case CV_32FC3:
|
||||
return RawImage::FLOAT32C3;
|
||||
default:
|
||||
return RawImage::UNKNOWN;
|
||||
case RawImage::UINT8:
|
||||
return 1;
|
||||
case RawImage::UINT16:
|
||||
return 2;
|
||||
case RawImage::UINT32:
|
||||
case RawImage::FLOAT32:
|
||||
return 4;
|
||||
case RawImage::FLOAT64:
|
||||
return 8;
|
||||
default: return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int Type2CV(RawImage::ImgType type)
|
||||
void RawImage::allocate(uint32_t w, uint32_t h, uint32_t ch, DataType type)
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case RawImage::UINT8:
|
||||
return CV_8U;
|
||||
case RawImage::UINT16:
|
||||
return CV_16U;
|
||||
case RawImage::FLOAT32:
|
||||
return CV_32F;
|
||||
case RawImage::UINT8C3:
|
||||
return CV_8UC3;
|
||||
case RawImage::UINT8C4:
|
||||
return CV_8UC4;
|
||||
case RawImage::UINT16C3:
|
||||
return CV_16UC3;
|
||||
case RawImage::UINT16C4:
|
||||
return CV_16UC4;
|
||||
case RawImage::FLOAT32C3:
|
||||
return CV_32FC3;
|
||||
case RawImage::UNKNOWN:
|
||||
return CV_8S;
|
||||
default:
|
||||
return CV_8U;
|
||||
}
|
||||
m_width = w;
|
||||
m_height = h;
|
||||
m_channels = ch;
|
||||
m_ch = ch == 3 ? 4 : ch;
|
||||
m_origType = m_type = type;
|
||||
m_pixels.reset(new PixelType[m_width * m_height * m_ch * typeSize(type)]);
|
||||
}
|
||||
|
||||
RawImage::RawImage()
|
||||
{
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
RawImage::RawImage(int w, int h, ImgType type)
|
||||
RawImage::RawImage(uint32_t w, uint32_t h, uint32_t ch, DataType type)
|
||||
{
|
||||
m_img.create(h, w, Type2CV(type));
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
RawImage::RawImage(cv::Mat &img)
|
||||
{
|
||||
m_img = img;
|
||||
m_stats = false;
|
||||
scaleToUnit();
|
||||
allocate(w, h, ch, type);
|
||||
}
|
||||
|
||||
RawImage::RawImage(const RawImage &d)
|
||||
{
|
||||
d.m_img.copyTo(m_img);
|
||||
m_mean = d.m_mean;
|
||||
m_stdDev = d.m_stdDev;
|
||||
m_median = d.m_median;
|
||||
m_min = d.m_min;
|
||||
m_max = d.m_max;
|
||||
m_mad = d.m_mad;
|
||||
allocate(d.m_width, d.m_height, d.m_channels, d.m_type);
|
||||
std::memcpy(m_pixels.get(), d.m_pixels.get(), m_width * m_height * m_ch * typeSize(m_type));
|
||||
m_stats = d.m_stats;
|
||||
m_saturated = d.m_saturated;
|
||||
}
|
||||
|
||||
RawImage::RawImage(RawImage &&d)
|
||||
{
|
||||
m_pixels = std::move(d.m_pixels);
|
||||
m_original = std::move(d.m_original);
|
||||
m_width = d.m_width;
|
||||
m_height = d.m_height;
|
||||
m_channels = d.m_channels;
|
||||
m_ch = d.m_ch;
|
||||
m_type = d.m_type;
|
||||
m_origType = d.m_origType;
|
||||
m_stats = d.m_stats;
|
||||
m_thumbAspect = d.m_thumbAspect;
|
||||
m_saturated = d.m_saturated;
|
||||
}
|
||||
|
||||
RawImage::RawImage(const QImage &img)
|
||||
{
|
||||
if(img.format() == QImage::Format_RGB32)
|
||||
qDebug() << img;
|
||||
if(img.format() == QImage::Format_RGBX8888)
|
||||
{
|
||||
m_img.create(img.height(), img.width(), CV_8UC4);
|
||||
allocate(img.width(), img.height(), 3, UINT8);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), img.scanLine(i), img.width()*4);
|
||||
cv::cvtColor(m_img, m_img, cv::COLOR_BGRA2RGB);
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*4);
|
||||
}
|
||||
else if(img.format() == QImage::Format_ARGB32)
|
||||
else if(img.format() == QImage::Format_RGBA8888)
|
||||
{
|
||||
m_img.create(img.height(), img.width(), CV_8UC4);
|
||||
allocate(img.width(), img.height(), 4, UINT8);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), img.scanLine(i), img.width()*4);
|
||||
cv::cvtColor(m_img, m_img, cv::COLOR_BGRA2RGBA);
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*4);
|
||||
}
|
||||
else if(img.format() == QImage::Format_RGBX64)
|
||||
{
|
||||
m_img.create(img.height(), img.width(), CV_16UC4);
|
||||
allocate(img.width(), img.height(), 3, UINT16);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), img.scanLine(i), img.width()*8);
|
||||
cv::cvtColor(m_img, m_img, cv::COLOR_RGBA2RGB);
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*8);
|
||||
}
|
||||
else if(img.format() == QImage::Format_RGBA64)
|
||||
{
|
||||
m_img.create(img.height(), img.width(), CV_16UC4);
|
||||
allocate(img.width(), img.height(), 4, UINT16);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), img.scanLine(i), img.width()*8);
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*8);
|
||||
}
|
||||
else if(img.format() == QImage::Format_Grayscale8)
|
||||
{
|
||||
allocate(img.width(), img.height(), 1, UINT8);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(data(i), img.scanLine(i), img.width());
|
||||
}
|
||||
else if(img.format() == QImage::Format_Grayscale16)
|
||||
{
|
||||
allocate(img.width(), img.height(), 1, UINT16);
|
||||
for(int i=0; i<img.height(); i++)
|
||||
std::memcpy(data(i), img.scanLine(i), img.width()*2);
|
||||
}
|
||||
else
|
||||
{
|
||||
QImage tmp = img.convertToFormat(QImage::Format_RGB888);
|
||||
m_img.create(img.height(), img.width(), CV_8UC3);
|
||||
|
||||
QImage tmp = img.convertToFormat(QImage::Format_RGBA8888);
|
||||
allocate(img.width(), img.height(), 4, UINT8);
|
||||
for(int i=0; i<tmp.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), tmp.scanLine(i), tmp.width()*3);
|
||||
std::memcpy(data(i), tmp.scanLine(i), tmp.width()*4);
|
||||
}
|
||||
m_stats = false;
|
||||
m_stats.m_stats = false;
|
||||
}
|
||||
|
||||
bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad, uint32_t *saturated)
|
||||
{
|
||||
if(!m_stats)calcStats();
|
||||
if(mean)*mean = m_mean;
|
||||
if(stdDev)*stdDev = m_stdDev;
|
||||
if(median)*median = m_median;
|
||||
if(min)*min = m_min;
|
||||
if(max)*max = m_max;
|
||||
if(mad)*mad = m_mad;
|
||||
if(!m_stats.m_stats)calcStats();
|
||||
if(mean)*mean = m_stats.m_mean[0];
|
||||
if(stdDev)*stdDev = m_stats.m_stdDev[0];
|
||||
if(median)*median = m_stats.m_median[0];
|
||||
if(min)*min = m_stats.m_min[0];
|
||||
if(max)*max = m_stats.m_max[0];
|
||||
if(mad)*mad = m_stats.m_mad[0];
|
||||
if(saturated)*saturated = m_saturated;
|
||||
|
||||
return true;
|
||||
@@ -144,10 +131,10 @@ bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *
|
||||
|
||||
void RawImage::calcStats()
|
||||
{
|
||||
if(m_stats)return;
|
||||
m_stats = true;
|
||||
if(m_stats.m_stats)return;
|
||||
m_stats.m_stats = true;
|
||||
|
||||
cv::Scalar meanS, stdDevS;
|
||||
/*cv::Scalar meanS, stdDevS;
|
||||
|
||||
cv::meanStdDev(m_img, meanS, stdDevS);
|
||||
cv::minMaxIdx(m_img, &m_min, &m_max);
|
||||
@@ -200,12 +187,12 @@ void RawImage::calcStats()
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(img.type() == CV_32F)m_mad /= histSize;
|
||||
if(img.type() == CV_32F)m_mad /= histSize;*/
|
||||
}
|
||||
|
||||
void RawImage::rect(int &x, int &y, int w, int h, std::vector<double> &r) const
|
||||
{
|
||||
r.resize(w*h);
|
||||
/*r.resize(w*h);
|
||||
x -= w/2;
|
||||
y -= h/2;
|
||||
if(x<0)x = 0;
|
||||
@@ -215,12 +202,12 @@ void RawImage::rect(int &x, int &y, int w, int h, std::vector<double> &r) const
|
||||
cv::Mat roiImg(m_img, cv::Rect(x, y, w, h));
|
||||
cv::Mat doubleMat;
|
||||
roiImg.convertTo(doubleMat, CV_64F);
|
||||
r = std::vector<double>(doubleMat.begin<double>(), doubleMat.end<double>());
|
||||
r = std::vector<double>(doubleMat.begin<double>(), doubleMat.end<double>());*/
|
||||
}
|
||||
|
||||
int RawImage::findPeaks(double background, double distance, std::vector<Peak> &peaks) const
|
||||
{
|
||||
std::vector<std::vector<cv::Point>> contours;
|
||||
/*std::vector<std::vector<cv::Point>> contours;
|
||||
|
||||
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(distance, distance));
|
||||
|
||||
@@ -240,29 +227,22 @@ int RawImage::findPeaks(double background, double distance, std::vector<Peak> &p
|
||||
peaks.push_back(Peak(1, contour[0].x, contour[0].y));
|
||||
}
|
||||
|
||||
return peaks.size();
|
||||
}
|
||||
|
||||
RawImage* RawImage::medianFilter() const
|
||||
{
|
||||
RawImage *ret = new RawImage();
|
||||
cv::medianBlur(m_img, ret->m_img, 3);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void RawImage::quarter()
|
||||
{
|
||||
|
||||
return peaks.size();*/
|
||||
}
|
||||
|
||||
uint32_t RawImage::width() const
|
||||
{
|
||||
return m_img.cols;
|
||||
return m_width;
|
||||
}
|
||||
|
||||
uint32_t RawImage::height() const
|
||||
{
|
||||
return m_img.rows;
|
||||
return m_height;
|
||||
}
|
||||
|
||||
uint32_t RawImage::channels() const
|
||||
{
|
||||
return m_channels;
|
||||
}
|
||||
|
||||
uint32_t RawImage::size() const
|
||||
@@ -270,27 +250,21 @@ uint32_t RawImage::size() const
|
||||
return width()*height();
|
||||
}
|
||||
|
||||
RawImage::ImgType RawImage::type() const
|
||||
RawImage::DataType RawImage::type() const
|
||||
{
|
||||
return CV2Type(m_img.type());
|
||||
}
|
||||
|
||||
int RawImage::dataType() const
|
||||
{
|
||||
return m_img.type();
|
||||
return m_type;
|
||||
}
|
||||
|
||||
uint32_t RawImage::norm() const
|
||||
{
|
||||
switch(m_img.type())
|
||||
switch(m_type)
|
||||
{
|
||||
case CV_8U:
|
||||
case CV_8UC3:
|
||||
case CV_8UC4:
|
||||
case UINT8:
|
||||
return UINT8_MAX;
|
||||
case CV_16U:
|
||||
case CV_16UC3:
|
||||
case UINT16:
|
||||
return UINT16_MAX;
|
||||
case UINT32:
|
||||
return UINT32_MAX;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
@@ -298,37 +272,113 @@ uint32_t RawImage::norm() const
|
||||
|
||||
void* RawImage::data()
|
||||
{
|
||||
return m_img.ptr();
|
||||
return m_pixels.get();
|
||||
}
|
||||
|
||||
const void *RawImage::data() const
|
||||
{
|
||||
return m_img.ptr();
|
||||
return m_pixels.get();
|
||||
}
|
||||
|
||||
void *RawImage::data(uint32_t row, uint32_t col)
|
||||
{
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
const void *RawImage::data(uint32_t row, uint32_t col) const
|
||||
{
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
void *RawImage::origData(uint32_t row, uint32_t col) const
|
||||
{
|
||||
if(m_original)
|
||||
return m_original.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_origType);
|
||||
else
|
||||
return m_pixels.get() + (m_width * row * m_ch + col * m_ch) * typeSize(m_type);
|
||||
}
|
||||
|
||||
void RawImage::convertToThumbnail()
|
||||
{
|
||||
m_thumbAspect = (float)width() / height();
|
||||
switch(CV_MAT_DEPTH(m_img.type()))
|
||||
uint16_t *out = reinterpret_cast<uint16_t*>(new uint8_t[THUMB_SIZE * THUMB_SIZE * 4 * sizeof(uint16_t)]);
|
||||
|
||||
auto loop = [&](uint16_t *out, auto *in, auto scale)
|
||||
{
|
||||
case CV_8U:
|
||||
m_img.convertTo(m_img, CV_16U, 255);
|
||||
for(int i=0; i<THUMB_SIZE; i++)
|
||||
{
|
||||
for(int o=0; o<THUMB_SIZE; o++)
|
||||
{
|
||||
int idx = (i*THUMB_SIZE + o)*4;
|
||||
int idx2 = ((i * m_height / THUMB_SIZE * m_width) + (o * m_width / THUMB_SIZE)) * m_ch;
|
||||
if(m_channels == 1)
|
||||
{
|
||||
out[idx] = out[idx + 1] = out[idx + 2] = in[idx2] * scale;
|
||||
}
|
||||
else
|
||||
{
|
||||
out[idx] = in[idx2] * scale;;
|
||||
out[idx + 1] = in[idx2 + 1] * scale;;
|
||||
out[idx + 2] = in[idx2 + 2] * scale;;
|
||||
}
|
||||
out[idx + 3] = UINT16_MAX;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
switch(m_type)
|
||||
{
|
||||
case UINT8:
|
||||
loop(out, reinterpret_cast<uint8_t*>(m_pixels.get()), 256);
|
||||
break;
|
||||
case CV_32F:
|
||||
m_img.convertTo(m_img, CV_16U, 65535);
|
||||
case UINT16:
|
||||
loop(out, reinterpret_cast<uint16_t*>(m_pixels.get()), 1);
|
||||
break;
|
||||
case CV_16U:
|
||||
case UINT32:
|
||||
loop(out, reinterpret_cast<uint32_t*>(m_pixels.get()), UINT16_MAX/(float)UINT32_MAX);
|
||||
break;
|
||||
case FLOAT32:
|
||||
loop(out, reinterpret_cast<float*>(m_pixels.get()), 65535.0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
qDebug() << "Should not happend";
|
||||
delete [] out;
|
||||
return;
|
||||
}
|
||||
|
||||
if(m_img.channels() == 1)
|
||||
cv::cvtColor(m_img, m_img, cv::COLOR_GRAY2RGB);
|
||||
if(m_img.channels() == 4)
|
||||
cv::cvtColor(m_img, m_img, cv::COLOR_RGBA2RGB);
|
||||
cv::Size dsize(THUMB_SIZE, THUMB_SIZE);
|
||||
cv::resize(m_img, m_img, dsize, 0, 0, cv::INTER_NEAREST);
|
||||
m_pixels.reset(reinterpret_cast<uint8_t*>(out));
|
||||
m_width = THUMB_SIZE;
|
||||
m_height = THUMB_SIZE;
|
||||
m_ch = 4;
|
||||
m_channels = 3;
|
||||
m_type = UINT16;
|
||||
}
|
||||
|
||||
void RawImage::convertToGLFormat()
|
||||
{
|
||||
size_t s = size() * m_ch;
|
||||
if(m_type == UINT32)
|
||||
{
|
||||
m_original = std::move(m_pixels);
|
||||
allocate(m_width, m_height, m_channels, FLOAT32);
|
||||
m_origType = UINT32;
|
||||
float *dst = reinterpret_cast<float*>(m_pixels.get());
|
||||
uint32_t *src = reinterpret_cast<uint32_t*>(m_original.get());
|
||||
|
||||
for(size_t i = 0; i < s; i++)
|
||||
dst[i] = src[i] / (float)UINT32_MAX;
|
||||
}
|
||||
else if(m_type == FLOAT64)
|
||||
{
|
||||
m_original = std::move(m_pixels);
|
||||
allocate(m_width, m_height, m_channels, FLOAT32);
|
||||
m_origType = FLOAT64;
|
||||
float *dst = reinterpret_cast<float*>(m_pixels.get());
|
||||
double *src = reinterpret_cast<double*>(m_original.get());
|
||||
|
||||
for(size_t i = 0; i < s; i++)
|
||||
dst[i] = src[i];
|
||||
}
|
||||
}
|
||||
|
||||
float RawImage::thumbAspect() const
|
||||
@@ -336,69 +386,94 @@ float RawImage::thumbAspect() const
|
||||
return m_thumbAspect;
|
||||
}
|
||||
|
||||
const cv::Mat& RawImage::mat() const
|
||||
{
|
||||
return m_img;
|
||||
}
|
||||
|
||||
bool RawImage::pixel(int x, int y, QVector3D &rgb) const
|
||||
bool RawImage::pixel(int x, int y, double &r, double &g, double &b) const
|
||||
{
|
||||
if(x < 0 || y < 0 || x >= (int)width() || y >= (int)height())return false;
|
||||
|
||||
switch(m_img.type())
|
||||
switch(m_origType)
|
||||
{
|
||||
case CV_8U:
|
||||
case UINT8:
|
||||
{
|
||||
uint8_t v = m_img.at<uint8_t>(y, x);
|
||||
rgb = QVector3D(v, v, v);
|
||||
const uint8_t *v = static_cast<const uint8_t*>(origData(y, x));
|
||||
if(m_channels == 1)
|
||||
{
|
||||
r = g = b = *v;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = v[0];
|
||||
g = v[1];
|
||||
b = v[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CV_16U:
|
||||
case UINT16:
|
||||
{
|
||||
uint16_t v = m_img.at<uint16_t>(y, x);
|
||||
rgb = QVector3D(v, v, v);
|
||||
const uint16_t *v = static_cast<const uint16_t*>(origData(y, x));
|
||||
if(m_channels == 1)
|
||||
{
|
||||
r = g = b = *v;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = v[0];
|
||||
g = v[1];
|
||||
b = v[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CV_32F:
|
||||
case UINT32:
|
||||
{
|
||||
float v = m_img.at<float>(y, x);
|
||||
rgb = QVector3D(v, v, v);
|
||||
const uint32_t *v = static_cast<const uint32_t*>(origData(y, x));
|
||||
if(m_channels == 1)
|
||||
{
|
||||
r = g = b = *v;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = v[0];
|
||||
g = v[1];
|
||||
b = v[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CV_8UC3:
|
||||
case FLOAT32:
|
||||
{
|
||||
cv::Vec3b v = m_img.at<cv::Vec3b>(y, x);
|
||||
rgb = QVector3D(v[0], v[1], v[2]);
|
||||
const float *v = static_cast<const float*>(origData(y, x));
|
||||
if(m_channels == 1)
|
||||
{
|
||||
r = g = b = *v;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = v[0];
|
||||
g = v[1];
|
||||
b = v[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CV_8UC4:
|
||||
case FLOAT64:
|
||||
{
|
||||
cv::Vec4b v = m_img.at<cv::Vec4b>(y, x);
|
||||
rgb = QVector3D(v[0], v[1], v[2]);
|
||||
const double *v = static_cast<const double*>(origData(y, x));
|
||||
if(m_channels == 1)
|
||||
{
|
||||
r = g = b = *v;
|
||||
}
|
||||
else
|
||||
{
|
||||
r = v[0];
|
||||
g = v[1];
|
||||
b = v[2];
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CV_16UC3:
|
||||
{
|
||||
cv::Vec3w v = m_img.at<cv::Vec3w>(y, x);
|
||||
rgb = QVector3D(v[0], v[1], v[2]);
|
||||
break;
|
||||
}
|
||||
case CV_32FC3:
|
||||
{
|
||||
cv::Vec3f v = m_img.at<cv::Vec3f>(y, x);
|
||||
rgb = QVector3D(v[0], v[1], v[2]);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
rgb = QVector3D(0, 0, 0);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void RawImage::scaleToUnit()
|
||||
{
|
||||
if(CV_MAT_DEPTH(m_img.type()) == CV_32F)
|
||||
/*if(CV_MAT_DEPTH(m_img.type()) == CV_32F)
|
||||
{
|
||||
double min, max;
|
||||
cv::minMaxIdx(m_img, &min, &max);
|
||||
@@ -408,15 +483,70 @@ void RawImage::scaleToUnit()
|
||||
float zero = min * scale;
|
||||
m_img = m_img * scale - zero;
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
void RawImage::downscaleTo(uint32_t size)
|
||||
{
|
||||
if(size < width() || size < height())
|
||||
/*if(size < width() || size < height())
|
||||
{
|
||||
double s = (double)size / std::max(width(), height());
|
||||
cv::Size dsize(std::floor(width() * s), std::floor(height() * s));
|
||||
cv::resize(m_img, m_img, dsize, 0, 0, cv::INTER_AREA);
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
RawImage *RawImage::fromPlanar(const RawImage &img)
|
||||
{
|
||||
return RawImage::fromPlanar(img.data(), img.width(), img.height(), img.channels(), img.type());
|
||||
}
|
||||
|
||||
RawImage *RawImage::fromPlanar(const void *pixels, uint32_t w, uint32_t h, uint32_t ch, RawImage::DataType type)
|
||||
{
|
||||
RawImage *image = new RawImage(w, h, ch, type);
|
||||
size_t size = w * h;
|
||||
size_t ch2 = ch == 1 ? 1 : 4;
|
||||
auto convert = [&](auto *in, auto *out, auto alpha)
|
||||
{
|
||||
for(size_t i=0; i<size; i++)
|
||||
for(size_t o=0; o<ch; o++)
|
||||
out[i*ch2 + o] = in[o*size + i];
|
||||
|
||||
if(ch != ch2)
|
||||
for(size_t i=0; i<size; i++)
|
||||
out[i*ch2 + 3] = alpha;
|
||||
};
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case UINT8:
|
||||
convert(static_cast<const uint8_t*>(pixels), static_cast<uint8_t*>(image->data()), UINT8_MAX);
|
||||
break;
|
||||
case UINT16:
|
||||
convert(static_cast<const uint16_t*>(pixels), static_cast<uint16_t*>(image->data()), UINT16_MAX);
|
||||
break;
|
||||
case UINT32:
|
||||
convert(static_cast<const uint32_t*>(pixels), static_cast<uint32_t*>(image->data()), UINT32_MAX);
|
||||
break;
|
||||
case FLOAT32:
|
||||
convert(static_cast<const float*>(pixels), static_cast<float*>(image->data()), 1);
|
||||
break;
|
||||
case FLOAT64:
|
||||
convert(static_cast<const double*>(pixels), static_cast<double*>(image->data()), 1);
|
||||
break;
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
std::vector<RawImage> RawImage::split() const
|
||||
{
|
||||
std::vector<RawImage> planes;
|
||||
planes.resize(m_channels);
|
||||
for(size_t i=0; i<m_channels; i++)
|
||||
planes[i].allocate(m_width, m_height, 1, m_type);
|
||||
|
||||
|
||||
|
||||
return planes;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user