You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

146 lines
2.8 KiB
C++

#include "colossusbase.h"
#include "qlabel.h"
#include <QPixmap>
#include "opencv.hpp"
#include "core\mat.hpp"
cv::Mat ColossusBase::QImage2cvMat(QImage image)
{
cv::Mat mat;
switch (image.format())
{
case QImage::Format_ARGB32:
case QImage::Format_RGB32:
case QImage::Format_ARGB32_Premultiplied:
mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine());
break;
case QImage::Format_RGB888:
mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine());
cvtColor(mat, mat, CV_BGR2RGB);
break;
case QImage::Format_Indexed8:
mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine());
break;
}
return mat;
}
QImage* ColossusBase::convMat2QImage(cv::Mat & img)
{
if (img.empty())
{
return NULL;
}
int h = img.rows;// iplimg->height;
int w = img.cols;// iplimg->width;
int channels = img.channels();// ->nChannels;
QImage *qimg = new QImage(w, h, QImage::Format_ARGB32);
if (h*w*channels <= 0)
{
return qimg;
}
uchar *data = img.data;// ->imageData;
for (int y = 0; y < h; y++, data += img.step/*->widthStep*/)
{
for (int x = 0; x < w; x++)
{
char r, g, b, a = 0;
if (channels == 1)
{
r = data[x*channels];
g = data[x*channels];
b = data[x*channels];
}
else if (channels == 3 || channels == 4)
{
r = data[x*channels + 2];
g = data[x*channels + 1];
b = data[x*channels];
}
if (channels == 4)
{
a = data[x*channels + 3];
qimg->setPixel(x, y, qRgba(r, g, b, a));
}
else
{
qimg->setPixel(x, y, qRgb(r, g, b));
}
}
}
return qimg;
}
QImage * ColossusBase::imgScale(QImage *img, int nWidth, int nHeight)
{
if (!img)
{
return NULL;
}
if (img->width() / img->height() >= nWidth / nHeight)
{
*img = img->scaledToWidth(nWidth);
}
else
{
*img = img->scaledToHeight(nHeight);
}
return img;
}
QImage * ColossusBase::imgScale(QImage &img, int nWidth /*= 480*/, int nHeight /*= 360*/)
{
if (img.width() / img.height() >= nWidth / nHeight)
{
img = img.scaledToWidth(nWidth);
}
else
{
img = img.scaledToHeight(nHeight);
}
return &img;
}
bool ColossusBase::showImage(cv::Mat & src, QLabel *pLabel)
{
if (src.empty())
{
return false;
}
QImage* img = ColossusBase::convMat2QImage(src);
img = ColossusBase::imgScale(img);
pLabel->setPixmap(QPixmap::fromImage(*img));
pLabel->show();
delete img;
return true;
}
bool ColossusBase::showImage(cv::Mat & src, lpImgViewer *pImgViewer)
{
if (src.empty())
{
pImgViewer->clear();
return false;
}
QImage* img = ColossusBase::convMat2QImage(src);
showImage(*img, pImgViewer);
delete img;
return true;
}
bool ColossusBase::showImage(QImage& img, lpImgViewer *pImgViewer)
{
pImgViewer->setImg(img);
return true;
}