/// 转化Mat为QImage QImage scan::Mat2QImage(const cv::Mat& mat) { QImage img; int chana = mat.channels(); /// 依据通道数不同,改变不同的装换方式 if (chana > 1) { //img = QImage(static_cast<uchar *>(mat.data),mat.cols,mat.rows,QImage::Format_RGB888); cv::cvtColor(mat, mat, CV_BGR2RGB); /// construct the QImage using the data of the mat, while do not copy the data img = QImage((const uchar*)(mat.data), mat.cols, mat.rows, mat.step,//TmpMat.cols*TmpMat.channels(), QImage::Format_RGB888); } else if (4 == chana) { cv::cvtColor(mat, mat, CV_BGR2RGB); /// construct the QImage using the data of the mat, while do not copy the data img = QImage((const uchar*)(mat.data), mat.cols, mat.rows, mat.step,//TmpMat.cols*TmpMat.channels(), QImage::Format_ARGB32); } else { /// 单通道,灰度图 img = QImage(mat.cols, mat.rows, QImage::Format_Indexed8); uchar* matdata = mat.data; for (int row = 0; row < mat.rows; ++row) { uchar* rowdata = img.scanLine(row); memcpy(rowdata, matdata, mat.cols); matdata += mat.cols; } QVector<QRgb> colorTable; for (int k = 0;k < 256;++k) { colorTable.push_back(qRgb(k, k, k)); } img.setColorTable(colorTable); } img.bits(); return img; }