QImage与cv::Mat互相转换-包括32F图像转换
cv::Mat转QImage(拷贝转换)
QImage cvMat2QImage(const cv::Mat& mat) { if (mat.empty()) { return QImage(); } QImage image; switch (mat.type()) { case CV_8UC1: { image = QImage((const uchar*)(mat.data), mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_8UC2: { mat.convertTo(mat, CV_8UC1); image = QImage((const uchar*)(mat.data), mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_8UC3: { // Copy input Mat const uchar *pSrc = (const uchar*)mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } case CV_8UC4: { // Copy input Mat const uchar *pSrc = (const uchar*)mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_ARGB32); return image.copy(); } case CV_32FC1: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_32FC3: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX,-1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } case CV_64FC1: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_64FC3: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } case CV_32SC1: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_32SC3: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } case CV_16SC1: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_16SC3: { Mat normalize_mat; normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); normalize_mat.convertTo(normalize_mat, CV_8U); const uchar *pSrc = (const uchar*)normalize_mat.data; // Create QImage with same dimensions as input Mat QImage image(pSrc, normalize_mat.cols, normalize_mat.rows, normalize_mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } case CV_8SC1: { //Mat normalize_mat; //normalize(mat, normalize_mat, 0, 255, NORM_MINMAX, -1); mat.convertTo(mat, CV_8U); const uchar *pSrc = (const uchar*)mat.data; QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_Grayscale8); return image.copy(); } case CV_8SC3: { mat.convertTo(mat, CV_8U); const uchar *pSrc = (const uchar*)mat.data; QImage image(pSrc, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); return image.rgbSwapped(); } default: mat.convertTo(mat, CV_8UC3); QImage image((const uchar*)mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888); return image.rgbSwapped(); return QImage(); break; } }
QImage转cv::Mat(共享内存的转换)
cv::Mat QImage2cvMat(QImage& image) { cv::Mat mat; //qDebug() << image.format(); switch (image.format()) { case QImage::Format_ARGB32: mat = cv::Mat(image.height(), image.width(), CV_8UC4, (void*)image.constBits(), image.bytesPerLine()); break; case QImage::Format_RGB32: mat = cv::Mat(image.height(), image.width(), CV_8UC3, (void*)image.constBits(), image.bytesPerLine()); //cv::cvtColor(mat, mat, CV_BGR2RGB); break; 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()); //cv::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; case QImage::Format_Grayscale8: mat = cv::Mat(image.height(), image.width(), CV_8UC1, (void*)image.constBits(), image.bytesPerLine()); break; } return mat; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)