OpenCV&Qt学习之二——QImage的进一步认识
来源:互联网 发布:全屏截图软件 编辑:程序博客网 时间:2024/05/16 17:14
作者:emouse 思·睿
转自:http://www.cnblogs.com/emouse/archive/2013/03/29/2989592.html
QImage的指针问题
接着上一篇博客:OpenCV&Qt学习之一——打开图片文件并显示,实现基本的打开图片并转换显示之后接下来将函数在分别进行封装,便于下一步的处理。代码如下:
#include "widget.h"#include "ui_widget.h"#include <QDebug>Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget){ ui->setupUi(this);}Widget::~Widget(){ delete ui;}void Widget::on_openButton_clicked(){ QString fileName = QFileDialog::getOpenFileName(this,tr("Open Image"), ".",tr("Image Files (*.png *.jpg *.bmp)")); qDebug()<<"filenames:"<<fileName; image = cv::imread(fileName.toAscii().data()); qimg = Widget::Mat2QImage(image); display(qimg); //display by the label}QImage Widget::Mat2QImage(const cv::Mat &mat){ QImage img; Mat rgb; if(mat.channels()==3) { //cvt Mat BGR 2 QImage RGB cvtColor(mat,rgb,CV_BGR2RGB); img =QImage((const unsigned char*)(rgb.data), rgb.cols,rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888); } else { img =QImage((const unsigned char*)(mat.data), mat.cols,mat.rows, mat.cols*mat.channels(), QImage::Format_RGB888); } return img;}void Widget::display(const QImage img){ ui->imagelabel->setPixmap(QPixmap::fromImage(img)); ui->imagelabel->resize(ui->imagelabel->pixmap()->size());}
相对于OpenCV&Qt学习之一——打开图片文件并显示 中间的代码,这里的改动有限,只是把转换的功能单独封装成为一个函数QImage Widget::Mat2QImage(const cv::Mat &mat) 通过返回的方式,再调用void Widget::display(const QImage img) 来显示,本来觉得应该非常简单的,但是一运行显示的不是全白就是全黑的图像,而把
ui->imagelabel->setPixmap(QPixmap::fromImage(img)); ui->imagelabel->resize(ui->imagelabel->pixmap()->size());
直接放入return之前在函数中显示就没有任何问题,也就是说,img在函数内部没有问题,但是在通过函数调用传出来的时候丢了数据,我以为是由于设置成局部变量被释放的原因,各种尝试之后仍然不行,这个问题让我郁闷了一下午。
由于之前做的多是单片机等嵌入式平台的程序开发,所 以涉及到的语言应用都比较基础,经过多方查找才发现可能是指针问题,这里先看QImage的定义:
img =QImage((const unsigned char*)(rgb.data), rgb.cols,rgb.rows, rgb.cols*rgb.channels(), QImage::Format_RGB888);
QImage格式和Mat是在数据结构上有所不同,这里的img只是对Mat格式的rgb中的数据进行重新组织,其中数据部分还是(const unsigned char*)(rgb.data),是指向rgb的指针,而问题就出在rgb上,rgb是被定义为局部变量的,在函数调用结束后,虽然值能够被正常传递,但是指针指向的位置却被释放了,因此把rgb更改为全局变量问题解决。
这个问题在大量指针的运用中非常容易出错,而且不易发现,看来指针的运用还需要加强学习。
- OpenCV&Qt学习之二——QImage的进一步认识
- OpenCV&Qt进修之二——QImage的进一步熟悉
- 【opencv学习之二】opencv与qt图像格式交换IplImage-->QImage
- [原]opencv学习之QT,Mat 2 QImage
- Scala学习之数组的进一步认识
- OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt
- 【opencv学习之三】opencv与qt图像格式交换调试问题和补充(IplImage-->QImage)
- OpenCv-python之进一步认识像素
- QT的进一步学习
- QT的QImage 与 Opencv的Mat 之间的转换
- QT 之 QImage类
- qt之QImage
- 自学qt之QImage
- 将opencv的Mat转换为qt的QImage
- OpenCv:IplImage,Mat和Qt:QImage之间的快速转换
- QT显示OPENCV的图像(IplImage 转为QImage)
- opencv Mat 与 Qt QImage之间的转换
- Qt的QImage类
- 虚拟机镜像文件yum配置
- OpenCV&Qt学习之一——打开图片文件并显示
- C#通过ODAC访问Oracle12c
- 【串口通信】——把你的Read事件写“活”了
- 将eclipse项目和svn关联(本地提交到服务器)
- OpenCV&Qt学习之二——QImage的进一步认识
- OpenCV&Qt学习之三——图像的初步处理
- dddd
- OpenCV在ARM上的移植
- 不可不知的css十大密技
- Lua 开始
- 智能家居
- OpenDaylight学习记录--安装
- CSS解决浏览器的等宽空格问题