名人名言:一个人光溜溜地到这个世界上来,最后光溜溜地离开这个世界而去,彻底想起来,
名利都是身外物,只有尽一个人的心力,使社会上的人多得他工作的裨益,是人生最愉快的事情。——邹韬奋
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()
{
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 lable
}
QImage Widget::Mat2QImage(const cv :: Mat &mat)
{
QImage img;
Mat rgb;
if (mat.channels() == 3)
{
//cvt Mat BGR to 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->imagelable->setPixmap(QPixmap::Image(img));
ui->imagelable->resize(ui->imagelable->pixmap()->size());
}
相对于OpenCV&Qt进修之一——打开文件并显示 中心的代码,这里的批改有限,只是把转换的功能零丁封装成为一个函数
QImage Widget::Mat2QImage(const cv::Mat &mat) 经由过程返回的体式格式,再调用void Widget::display(const
QImage img) 来显示,底本感觉应当很是简单的,然则一运行显示的不是全白就是全黑的图像,而把
ui->imagelable->setPixmap(QPixmap::Image(img));
ui->imagelable->resize(ui->imagelable->pixmap()->size());
直接放入return之前在函数中显示就没有任何题目,也就是说,img在函数内部没有题目,然则在经由过程函数调用传出来的时辰丢了数据,我认为是因为设置成局部变量被开释的原因,各类测验测验之后仍然不可,这个题目让我愁闷了一下午。
因为之前做的多是单片机等嵌入式平台的法度开辟,所&#160; 以涉及到的说话应用都斗劲根蒂根基,经过多方查找才发明可能是指针题目,这里先看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更改为全局变量题目解决。