qimage 与cv::mat 转化--> QPixmap
2015-06-26 10:16
211 查看
最近qt项目里有段图像处理与显示的程序设计:
1. opencv对于摄像头读取与处理比较方便,所以采用opencv前段采集图像与进行图像处理。
2. qt界面只负责显示图片:这一块主要依赖的是label标签来显示,需要的文件是格式是QPixmap。
3. cv::Mat --> QImage --> QPixmap 图片的转换。
4. 定时事件读取摄像头:固定频率读取摄像头图像
5.主要注意点是:cv::Mat --> QImage :这两者内存管理机制不一样
这两者内存管理机制不一样。
Memory management.
on write (I'm also new with open cv (2 weeks) so I can't explain yet exactly how it works but I've stumbled on some crushes because of that)!
Another thing is that when you are creating
Final outcome is that on Linux and Qt5 your code is crashes because of problems with memory management. On your screen shot you can see at the top of second window that something strange is going on and you see some memory trash.
QImage的构造函数进行转换,主要是使用cv::Mat的data来构造一个QImage类型,这样做确实可以达到转换目的,但是,因此这样构造出来的QImage本身并不保存data,因此,在QImage的生存周期内,必须保证cv::Mat中的数据不会被释放。上面的这个问题也是比较容易解决的,主要是通过调用QImage::bits函数来强制QImage进行深层次复制,使得QImage自己保存一份data的副本,这样就可以保证在cv::Mat中的数据被释放的时候,QImage还能正常使用。
参考:
http://stackoverflow.com/questions/17127762/cvmat-to-qimage-and-back
http://blog.csdn.net/loveaborn/article/details/7680834
OpenCV学习(2)--cv::Mat转化为QImage
1. opencv对于摄像头读取与处理比较方便,所以采用opencv前段采集图像与进行图像处理。
2. qt界面只负责显示图片:这一块主要依赖的是label标签来显示,需要的文件是格式是QPixmap。
void MainWindow::imgShow() { //qimg.load("/home/yhzhao/Desktop/12.png"); ui->labelImage->setPixmap(QPixmap::fromImage(qimg)); qDebug()<<"Tigger"; }
3. cv::Mat --> QImage --> QPixmap 图片的转换。
4. 定时事件读取摄像头:固定频率读取摄像头图像
5.主要注意点是:cv::Mat --> QImage :这两者内存管理机制不一样
QImage Widget::Mat2QImage(cv::Mat const& src) { cv::Mat temp; // make the same cv::Mat cvtColor(src, temp,CV_BGR2RGB); // cvtColor Makes a copt, that what i need QImage dest((const uchar *) temp.data, temp.cols, temp.rows, temp.step, QImage::Format_RGB888); dest.bits(); // enforce deep copy, see documentation // of QImage::QImage ( const uchar * data, int width, int height, Format format ) return dest; } cv::Mat Widget::QImage2Mat(QImage const& src) { cv::Mat tmp(src.height(),src.width(),CV_8UC3,(uchar*)src.bits(),src.bytesPerLine()); cv::Mat result; // deep copy just in case (my lack of knowledge with open cv) cvtColor(tmp, result,CV_BGR2RGB); return result; }
namedWindow("edges",0); qimg = Mat2QImage(pCam_qr_estimation->frame); img_test = QImage2Mat(qimg); imshow("edges", img_test );
这两者内存管理机制不一样。
Memory management.
cv::Matdoesn't work like
QImagein this mater. Remember that
QImageis using copy on write mechanism and shares memory for each copy.
cv::Matalso shares memory but it doesn't do copy
on write (I'm also new with open cv (2 weeks) so I can't explain yet exactly how it works but I've stumbled on some crushes because of that)!
Another thing is that when you are creating
QImagefrom memory image is using this memory and doesn't take ownership of it.
Final outcome is that on Linux and Qt5 your code is crashes because of problems with memory management. On your screen shot you can see at the top of second window that something strange is going on and you see some memory trash.
QImage的构造函数进行转换,主要是使用cv::Mat的data来构造一个QImage类型,这样做确实可以达到转换目的,但是,因此这样构造出来的QImage本身并不保存data,因此,在QImage的生存周期内,必须保证cv::Mat中的数据不会被释放。上面的这个问题也是比较容易解决的,主要是通过调用QImage::bits函数来强制QImage进行深层次复制,使得QImage自己保存一份data的副本,这样就可以保证在cv::Mat中的数据被释放的时候,QImage还能正常使用。
参考:
http://stackoverflow.com/questions/17127762/cvmat-to-qimage-and-back
http://blog.csdn.net/loveaborn/article/details/7680834
OpenCV学习(2)--cv::Mat转化为QImage
相关文章推荐
- 使用Xerces DOM 处理XML文件
- npm 安装太慢的解决办法
- [转]关闭ORACLE数据库
- C#创建目录,文件写入消息不覆 4000 盖原有消息
- Windows 10优秀壁纸是怎么设计出来的?
- 如何分析websphere中间件生成的javacore文件
- html页面显示list,生成下拉列表
- 想了23年后,马云开了家什么银行?
- 工作流学习——Activiti流程实例、任务管理四步曲
- ORACLE升级的一些事
- 最少拦截系统(贪心)
- android应用程序如何调用支付宝接口
- xcode6-添加真机设备
- ORACLE 更改用户名
- C++中const总结
- 开发社区
- 在Mac下面删除所有的.svn文件
- php从memcache读取数据再批量写入mysql的方法
- 6月23日全球域名商(国际域名)解析量排行榜TOP20
- C#实现文件与二进制互转并存入数据库