当前位置:网站首页>QImage的指针问题
QImage的指针问题
2022-08-03 08:09:00 【天天进步2015】
接着上一篇博客: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更改为全局变量问题解决。
这个问题在大量指针的运用中非常容易出错,而且不易发现,看来指针的运用还需要加强学习。
边栏推荐
- mysql 8.0.12 安装配置方法并--设置修改密码
- 图解Kernel Device Tree(设备树)的使用
- JMeter接口自动化发包与示例
- NFT到底有哪些实际用途?
- C# 一周入门高级编程之《C#-继承》Day One
- sqlite date field plus one day
- RViz报错: Error subscribing: Unable to load plugin for transport ‘compressed‘解决方法
- 使用pipreqs导出项目所需的requirements.txt(而非整个环境)
- Nacos使用实践
- 【TPC-DS】DF的SQL(Data Maintenance部分)
猜你喜欢
随机推荐
五、《图解HTTP》报文首部和HTTP缓存
循环神经网络RNN基础《PyTorch深度学习实践》
Mysql的in和exists用法区别
The Transformer, BERT, GPT paper intensive reading notes
How does Mysql query two data tables for the same fields in two tables at the same time
ArcEngine(三)通过MapControl控件实现放大缩小全图漫游
Guava的Service
mysql服务器上的mysql这个实例中表的介绍
volta管理node版本
Dapr 与 NestJs ,实战编写一个 Pub & Sub 装饰器
JS函数获取本月的第一天和最后一天
并发之ReentrantLock
《剑指Offer》刷题之打印从1到最大的n位数
Charles抓包工具学习记录
【TPC-DS】25张表的详细介绍,SQL的查询特征
数仓4.0(二)------ 业务数据采集平台
Transformer、BERT、GPT 论文精读笔记
推荐系统-排序层-精排模型:LR、GBDT、Wide&Deep、DCN、DIN、DIEN、MMOE、PLE
集群
BOM系列之localStorage








