当前位置:网站首页>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更改为全局变量问题解决。
这个问题在大量指针的运用中非常容易出错,而且不易发现,看来指针的运用还需要加强学习。
边栏推荐
- Taro框架-微信小程序-调用微信支付
- DeFi明斯基时刻:压力测试与启示
- pyspark---low frequency feature processing
- Eject stubborn hard drives with diskpart's offline command
- 分析型数据库性能测试总结
- PowerShell:执行 Install-Module 时,不能从 URI 下载
- 千万级别的表分页查询非常慢,怎么办?
- HCIP练习02(OSPF)
- 牛客 - 鼠标的天选(字符串哈希)
- How does Mysql query two data tables for the same fields in two tables at the same time
猜你喜欢
随机推荐
day12---接口和协议
Pop Harmony Basics Big Notes
ArcEngine(三)通过MapControl控件实现放大缩小全图漫游
前缀和(区间和,子矩阵的和)
The use of the database table structure document generation tool screw
Charles抓包工具学习记录
“唯一索引允许为空“ 的说法是不严谨的
跨域嵌套传递信息(iframe)
差分(前缀和的逆运算)
frp:开源内网穿透工具
学习笔记:机器学习之逻辑回归
mysql系统变量与状态变量
牛客 - 鼠标的天选(字符串哈希)
【TPC-DS】DF的SQL(Data Maintenance部分)
用云机器/虚拟机架设方舟游戏?
集群
vs 2022无法安装 vc_runtimeMinmum_x86错误
循环神经网络RNN基础《PyTorch深度学习实践》
PowerShell:执行 Install-Module 时,不能从 URI 下载
数据监控平台