使用QT显示OpenCV读取的图片

目录

  • 1. 概述
  • 2. 实现2.1. 代码2.2. 解析
  • 3. 结果

1. 概述

OpenCV自带了一部分常用的GUI功能,但是更多的图像处理功能需要其他GUI框架来辅助实现,这里通过QT来显示OpenCV读取的图片。

2. 实现

在QtCreator中新建一个基于QMainWindow的应用:

其中QImageShowWidget就是用于显示图像的控件,它是继承于QWidget实现的,可以将其嵌入QMainWindow的centralwidget中:

QImageShowWidget是自定义的显示组件,可以首先在QtCreator的设计师界面拖入一个QWidget,再通过“窗口部件提升”功能提升为QImageShowWidget。

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

2.1. 代码

qimageshowwidget.h代码如下:

#ifndef QIMAGESHOWWIDGET_H
#define QIMAGESHOWWIDGET_H#include <QWidget>class QImageShowWidget : public QWidget
{Q_OBJECT
public:explicit QImageShowWidget(QWidget *parent = nullptr);~QImageShowWidget();bool LoadImage(const char* imagePath);signals:public slots:protected:void paintEvent(QPaintEvent *);     //绘制void Release();private:uchar* winBuf;      //窗口填充bufint winWidth;      //窗口像素宽int winHeight;      //窗口像素高int winBandNum;      //波段数};#endif // QIMAGESHOWWIDGET_H

qimageshowwidget.cpp代码如下:

#include "qimageshowwidget.h"#include <opencv2\opencv.hpp>
#include <QPainter>
#include <QDebug>
#include <iostream>using namespace cv;
using namespace std;QImageShowWidget::QImageShowWidget(QWidget *parent) : QWidget(parent)
{//填充背景色setAutoFillBackground(true);setBackgroundRole(QPalette::Base);winBuf = nullptr;winWidth = rect().width();winHeight = rect().height();winBandNum = 3;
}QImageShowWidget::~QImageShowWidget()
{if(winBuf){delete[] winBuf;winBuf = nullptr;}
}bool QImageShowWidget::LoadImage(const char* imagePath)
{//从文件中读取成灰度图像Mat img = imread(imagePath);if (img.empty()){fprintf(stderr, "Can not load image %s\n", imagePath);return false;}Release();winWidth = rect().width();winHeight = rect().height();size_t winBufNum = (size_t) winWidth * winHeight * winBandNum;winBuf = new uchar[winBufNum];memset(winBuf, 255, winBufNum*sizeof(uchar));for (int ri = 0; ri < img.rows; ++ri){for (int ci = 0; ci < img.cols; ++ci){for(int bi = 0; bi < winBandNum; bi++){size_t m = (size_t) winWidth * winBandNum * ri + winBandNum * ci + bi;size_t n = (size_t) img.cols * winBandNum * ri + winBandNum * ci + bi;winBuf[m] = img.data[n];}}}update();return true;
}//重新实现paintEvent
void QImageShowWidget::paintEvent(QPaintEvent *)
{if(!winBuf){return;}QImage::Format imgFomat = QImage::Format_RGB888;QPainter painter(this);QImage qImg(winBuf, winWidth, winHeight, winWidth*winBandNum, imgFomat);painter.drawPixmap(0, 0, QPixmap::fromImage(qImg));
}void QImageShowWidget::Release()
{if(winBuf){delete[] winBuf;winBuf = nullptr;}
}

2.2. 解析

所有基于QWidget的类都可以重新实现界面重绘事件paintEvent(),它会在界面需要的时候(例如调用update())自动重绘。在这个事件函数中可以通过图形绘制接口QPainter绘制:

QImage::Format imgFomat = QImage::Format_RGB888;QPainter painter(this);
QImage qImg(winBuf, winWidth, winHeight, winWidth*winBandNum, imgFomat);
painter.drawPixmap(0, 0, QPixmap::fromImage(qImg));

可以看到QPainter绘制的其实是QImage对象,也就是重点是构造QImage这个对象。这个对象是由申请的内存winBuf来构建的。显示的图像是由宽、高以及波段组成的,需要将三维空间压缩为一维空间——简单来讲,内存的组成为RGBRGBRGB...,并且起点位置为左上角,由左至右,由上至下。

OpenCV读取的图像为Mat对象:

//从文件中读取成灰度图像
Mat img = imread(imagePath);
if (img.empty())
{fprintf(stderr, "Can not load image %s\n", imagePath);return false;
}

Mat对象可以通过data()方法直接访问读取的图像内存。而这块内存也是RGBRGBRGB...的结构组成,并且起点位置也是左上角,由左至右,由上至下。将其逐像素传入到申请的内存winBuf:

winWidth = rect().width();
winHeight = rect().height();
size_t winBufNum = (size_t) winWidth * winHeight * winBandNum;
winBuf = new uchar[winBufNum];
memset(winBuf, 255, winBufNum*sizeof(uchar));for (int ri = 0; ri < img.rows; ++ri)
{for (int ci = 0; ci < img.cols; ++ci){for(int bi = 0; bi < winBandNum; bi++){size_t m = (size_t) winWidth * winBandNum * ri + winBandNum * ci + bi;size_t n = (size_t) img.cols * winBandNum * ri + winBandNum * ci + bi;winBuf[m] = img.data[n];}}
}

3. 结果

通过界面加载一张图像,显示结果如下:

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52807.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV Mat读取和显示图片

一、从文件读取图像并显示 1. 程序 在基于VS2013搭建OpenCV开发环境这篇文章的最后给出了一个简单的Demo&#xff0c;这个例子跟本篇使用的例子是一样的。打开C IDE并创建一个新的项目&#xff0c;新建一个源文件&#xff0c;粘贴下面的代码&#xff1a; 1 2 3 4 5 6 7 8 9 10 …

opencv读取图片通道以及显示

使用cv2读取的图像的通道到是BGR通道&#xff0c;所以测试模型之前需要做BGR转RGB的操作。 imgcv2.imread(515.jpg) cv2.imshow("aa",img) cv2.waitKey(-1)显示结果&#xff1a; 显示结果是正常的。如果转为RGB后&#xff1f; import matplotlib.pyplot as plt im…

023期计算机开机号,大乐透2020023期开机号分析,历届023期开奖号码、及走势图...

大乐透2020023开机号 04 07 19 26 340211 前区分析&#xff1a; 和值&#xff1a;90 奇偶&#xff1a;2:3偶-奇-奇-偶-偶 前区推荐&#xff1a;03-05-11-13-16-26-27-28-32-35 后区推荐&#xff1a;03-04-10-11 (开机号码并非开奖号码&#xff0c;以上个人观点、仅供参考) 历史…

Compose Desktop打包后运行java.lang.ClassNotFoundException的巨坑

作业要用mysql&#xff0c;引入了一个jar包&#xff0c;放在lib目录下面&#xff0c;结果调试正常运行&#xff0c;一打包运行就各种出错&#xff0c;搞了一个多小时&#xff0c;配置了半天&#xff0c;最后chatgpt一行代码帮我解决了&#xff0c;光在项目结构里面配置引用库不…

Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column

Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 为了搞这个问题&#xff0c;卡了一个多小时&#xff0c;问chatgpt弄了半天&#xff0c;用上typeHandler发现版本有问题&#xff0c;也没有深究&#xff0c;退回原来版本看了半天…

[2021] 完美解决Unable to find image ‘hello-world:latest‘ locally 问题

安装Docker出现的问题 相信大家查询了很多的回答里面都是需要修改阿里镜像源&#xff0c;但是修改之后却无用。这是因为阿里那个源对于每个人来说都需要专属源。详细的内容可以参考菜鸟教程里的回答&#xff1a;菜鸟教程更换镜像源 接下来就简单的完成这个这个更换源的操作&a…

Jetson NX Xavier 编译opencv4.4(cuda版)

目录 *序言00|系统信息01|下载安装Jtop02|卸载自带的opencv2.1 为什么要卸载自带的opencv2.2 卸载默认的方法2.3 安装依赖库 03|Nvidia预构建opencv-cuda4.5参考资料 *序言 大部分人在解决问题的时候&#xff0c;百度输入的关键词不够准确&#xff0c;展示出来的页面多数是跟自…

小白学C语言数据结构之图

定义 由点集和边集形成的一个东西.. 比如 A ——————————B | | | | | | C——————————D 当然C和B也有可能有连接 A和D也有可能有连接 邻接表法 A&#xff1a;B(可以在括号里封装一个AB间的距离&#xff09;&#xff0c;C B&#xff1a;C&#xff0c;D C&#…

网络漏洞,我把全校学生信息都搞出来了!

因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 点击关注#互联网架构师公众号&#xff0c;领取架构师全套资料 都在这里 0、2T架构师学习资料干货分 上一篇&#xff1a;ChatGPT研究框架&#xff08;80页PPT&#xff0c;附下载&#xff09;…

比尔·盖茨:AI将为每人创造一个私人助手 科技市场面临洗牌?

自ChatGPT爆火以后&#xff0c;硅谷大厂们开启了生成式AI“军备竞赛”&#xff0c;都在争相推出能生成文字或影像的人工智能工具&#xff0c;科技圈或将迎来大变局。 在这场变局中&#xff0c;微软似乎已拔得头筹。微软首席执行官表示&#xff0c;“搜索引擎迎来了新时代”&…

我们学习到底是为了什么,到底什么才是我们真正想要的

原创 科大云炬 科大云炬 2019-04-26 、 今天看到一句话&#xff0c;感慨颇多:”现在的教育只是一味的强调一定要好好学习&#xff0c;却没有强调为什么要好好学习。 我们学习到底是为了什么&#xff0c;到底什么才是我们真正想要的。一千个读者会产生一千个哈姆雷特学过马哲…

ChatGPT与高等教育变革:价值、影响及未来发展

最近一段时间&#xff0c;ChatGPT吸引了社会各界的目光&#xff0c;它可以撰写会议通知、新闻稿、新年贺信&#xff0c;还可以作诗、写文章&#xff0c;甚至可以撰写学术论文。比尔盖茨、马斯克等知名人物纷纷为此发声&#xff0c;谷歌、百度等知名企业纷纷宣布要提供类似产品。…

用Python剪辑视频?太简单了

人生苦短&#xff0c;快学Python&#xff01; 最近我在网上下载一个视频&#xff0c;结果下载到本地是近百个视频片段&#xff0c;为了方便观看只能将这些片段合并为一个视频整体。 不过我并没有搜到能够处理类似情况的小工具&#xff0c;只是发现剪映等软件可以实现视频合并功…

python小应用之moviepy的视频剪辑制作gif图

对视频动画的编辑可以使用python的moviepy库&#xff0c;官方文档&#xff1a; http://zulko.github.io/moviepy/ 1、进入cmd&#xff0c;pip install moviepy 2、使用代码 #import imageio #imageio.plugins.ffmpeg.download() import moviepy.editor as mpy#视频文件的…

视频剪辑教程自学技巧:关于正确的短视频剪辑流程分享

视频剪辑教程自学技巧&#xff1a;关于正确的短视频剪辑流程分享 短视频的火热程度自然不用说&#xff0c;而这大概也是越来越多的人开始做短视频的原因。不过对于大多数的人来说&#xff0c;学习短视频剪辑&#xff0c;其实都是自学&#xff0c;这就导致很多人可能都还不知道…

做视频剪辑必须学会的几个剪辑软件,你知道哪些?

现在短视频非常火热&#xff0c;身边70%以上的人或多或少都会使用手机APP快速剪辑视频&#xff0c;但是如果大家想要通过视频剪辑变现&#xff0c;或者想要自己的视频出彩&#xff0c;那么掌握系统的剪辑方法、剪辑软件的使用是必不可少的&#xff0c;今天小编就给大家分享几款…

什么剪辑软件好用?视频剪辑这样做

什么剪辑软件好用&#xff1f;随着时代的快速发展&#xff0c;剪辑视频已经成为我们几乎人人必会的技能之一了。无论我们是专业人士还是非专业人士&#xff0c;在日常生活中多多少少都会使用到视频剪辑。很多小伙伴们潜意识里会觉得剪辑视频是一件十分困难的事情&#xff0c;其…

学习做视频剪辑,几分钟教会你剪辑技巧

现在很多人做自媒体&#xff0c;也有很多人想做自媒体。而视频剪辑是做自媒体必不可少的&#xff0c;所有我闪在分享视频之前&#xff0c;都会比如剔除一些多余的部分&#xff0c;或者是在视频画面添加图片等等&#xff0c;以此呈现更好的效果。但还是有许多的小伙伴不知道该怎…

百度发布「AI大底座」:一口气把10年AI技术积累打包了

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 技术创新的节点性时刻&#xff0c;往往是以基建变革的形式展现。 现在&#xff0c;中国AI头号玩家百度&#xff0c;再次明确复现了这一规律&#xff1a; AI大底座&#xff0c;已正式对外推出。 就在刚刚结束的百度AI开发者大会上&#…

打谱软件告诉你:编曲和作曲哪个难?

从各位学习打谱软件作曲大师的朋友反馈来看&#xff0c;我必须这麽说&#xff0c;编曲要能端上台面&#xff0c;一定比作曲难&#xff0c;但要作出一首好曲也绝对是不容易。 以进入的门槛来说&#xff0c;编曲当然是需要比较高的门槛&#xff0c;除了要懂乐理&#xff0c;各种…