Convert between cv::Mat and QImage 两种图片类转换
在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子:
- //##### cv::Mat ---> QImage #####
- // Shallow copy
- QImage mat2qimage_ref(cv::Mat &m, QImage::Format format) {
- return QImage(m.data, m.cols, m.rows, m.step, format);
- }
- // Deep copy
- QImage mat2qimage_cpy(cv::Mat &m, QImage::Format format) {
- return QImage(m.data, m.cols, m.rows, m.step, format).copy();
- }
- //##### QImage ---> cv::Mat #####
- // Shallow copy
- cv::Mat qimage2mat_ref(QImage &img, int format) {
- return cv::Mat(img.height(), img.width(), format, img.bits(), img.bytesPerLine());
- }
- // Deep copy
- cv::Mat qimage2mat_ref(QImage &img, int format) {
- return cv::Mat(img.height(), img.width(), format, const_cast<uchar*>(img.bits()), img.bytesPerLine()).clone();
- }
还可以用下面的这个代码,参考了这个帖子:
- //##### cv::Mat ---> QImage #####
- QImage cvMat_to_QImage(const cv::Mat &mat ) {
- switch ( mat.type() )
- {
- // 8-bit, 4 channel
- case CV_8UC4:
- {
- QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB32 );
- return image;
- }
- // 8-bit, 3 channel
- case CV_8UC3:
- {
- QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_RGB888 );
- return image.rgbSwapped();
- }
- // 8-bit, 1 channel
- case CV_8UC1:
- {
- static QVector<QRgb> sColorTable;
- // only create our color table once
- if ( sColorTable.isEmpty() )
- {
- for ( int i = ; i < ; ++i )
- sColorTable.push_back( qRgb( i, i, i ) );
- }
- QImage image( mat.data, mat.cols, mat.rows, mat.step, QImage::Format_Indexed8 );
- image.setColorTable( sColorTable );
- return image;
- }
- default:
- qDebug("Image format is not supported: depth=%d and %d channels\n", mat.depth(), mat.channels());
- break;
- }
- return QImage();
- }
- //##### QImage ---> cv::Mat #####
- cv::Mat QImage_to_cvMat( const QImage &image, bool inCloneImageData = true ) {
- switch ( image.format() )
- {
- // 8-bit, 4 channel
- case QImage::Format_RGB32:
- {
- cv::Mat mat( image.height(), image.width(), CV_8UC4, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
- return (inCloneImageData ? mat.clone() : mat);
- }
- // 8-bit, 3 channel
- case QImage::Format_RGB888:
- {
- if ( !inCloneImageData ) {
- qWarning() << "ASM::QImageToCvMat() - Conversion requires cloning since we use a temporary QImage";
- }
- QImage swapped = image.rgbSwapped();
- return cv::Mat( swapped.height(), swapped.width(), CV_8UC3, const_cast<uchar*>(swapped.bits()), swapped.bytesPerLine() ).clone();
- }
- // 8-bit, 1 channel
- case QImage::Format_Indexed8:
- {
- cv::Mat mat( image.height(), image.width(), CV_8UC1, const_cast<uchar*>(image.bits()), image.bytesPerLine() );
- return (inCloneImageData ? mat.clone() : mat);
- }
- default:
- qDebug("Image format is not supported: depth=%d and %d format\n", image.depth(), image.format());
- break;
- }
- return cv::Mat();
- }
Convert between cv::Mat and QImage 两种图片类转换的更多相关文章
- 【资料收集】Converting Between cv::Mat and QImage or QPixmap
参考: 方法一 Convert between cv::Mat and QImage 两种图片类转换 - Grandyang - 博客园 http://www.cnblogs.com/grandyan ...
- OpenCV图片类cv::Mat和QImage之间进行转换(好多相关文章)
在使用Qt和OpenCV混合编程时,我们有时需要在两种图片类cv::Mat和QImage之间进行转换,下面的代码参考了网上这个帖子: //##### cv::Mat ---> QImage ## ...
- OpenCV IplImage FlyCapture2 Image Conversion 两种图像类的相互转化
OpenCV的IplImag和 FlyCapture2 的 Image是两种常见的图片格式,在实际的应用中,我们通常要混合使用OpenCV和FlyCapture2这两个SDK,所以这两种图片格式之间的 ...
- WPF 下两种图片合成或加水印的方式(转载)
来源:http://www.cnblogs.com/lxblog/ 最近项目中应用多次应用了图片合成,为了今后方便特此记下. 在WPF下有两种图片合成的方式,一种还是用原来C#提供的GDI+方式,命名 ...
- 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js
估计网上能查到的最多的两种图片延迟加载方法就是jquery.scrollLoading.js与jquery.lazyload.js了,其中jquery.lazyload.js的调用方法因为有网友爆出的 ...
- iOS:图片上传时两种图片压缩方式的比较
上传图片不全面的想法:把图片保存到本地,然后把图片的路径上传到服务器,最后又由服务器把路径返回,这种方式不具有扩展性,如果用户换了手机,那么新手机的沙盒中就没有服务器返回的图片路径了,此时就无法获取之 ...
- 原生js - 两种图片懒加载实现原理
目前图片懒加载的方式主要有两种: 1.利用getBoundingClientRectAPI得到当前元素与视窗的距离来判断 2.利用h5的新API IntersectionObserver 来实现 ge ...
- 09 Python两种创建类的方式
第一种比较普遍的方式: class Work(): def __init__(self,name): self.name = name w = Work('well woker') 这样就简单创建了一 ...
- 两种图片延迟加载的方法总结jquery.scrollLoading.js与jquery.lazyload.js---转载
jquery.scrollLoading方法 html <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml& ...
随机推荐
- ML 06、感知机
机器学习算法 原理.实现与实践 —— 感知机 感知机(perceptron)是二分类的线性分类模型,输入为特征向量,输出为实例的类别,取值+1和-1.感知机学习旨在求出将训练数据进行线性划分的分离超 ...
- 遍历进程活动链表(ActiveProcessLinks)、DKOM隐藏进程
1.EPROCESS结构体 EPROCESS块来表示.EPROCESS块中不仅包含了进程相关了很多信息,还有很多指向其他相关结构数据结构的指针.例如每一个进程里面都至少有一个ETHREAD块表示的线程 ...
- AES128和AES256主要区别和安全程度是多少?他们对于机器的消耗是怎样的?两者性能如何?实际开发如何选择?
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES, ...
- session应用----登录验证小案例
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- 解决mysql shell执行中文表名报command not found错误
mysql -h 192.168.22.201 -uusername -ppassword --default-character-set=utf8 rom3 -e "DELETE FROM ...
- css3 -- 过渡与动画
1.注意使用前缀 2.属性: transition-property:none/all/属性 3.持续时间: transition-duration:默认值是0,即使是负值,按照0进行处理 4.tra ...
- jquery(ajax)与js(ajax)的比较
原始js: function update_mess(){ var account_name = $("#account").val(); var xmlhttp; if(wind ...
- http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
http://www.roncoo.com/course/view/a09d8badbce04bd380f56034f8e68be0
- Flume interceptor 使用注意事项
1. 在使用 Regex Filtering Interceptor的时候一个属性是excludeEvents 当它的值为true 的时候,过滤掉匹配到当前正则表达式的一行 当它的值为false的时候 ...
- ashx 文件 与js文件数据交互
//js代码 //城市下拉列表 $("#selPro").change(function() { var option = ...