显示之后接下来将函数在分别进行封装,便于下一步的处理惩罚。代码如下:
#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());
}
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更改为全局变量题目解决。
转载地址