OpenCV&Qt进修之二——QImage的进一步熟悉

OpenCV&Qt进修之二——QImage的进一步熟悉
名人名言:一个人光溜溜地到这个世界上来,最后光溜溜地离开这个世界而去,彻底想起来,
名利都是身外物,只有尽一个人的心力,使社会上的人多得他工作的裨益,是人生最愉快的事情。——邹韬奋 

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更改为全局变量题目解决。


转载地址


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值