#include "colossusbase.h" #include "qlabel.h" #include #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; }