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++
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;
|
|
}
|