【Qt+opencv】图片与视频的操作
文章目录
- 前言
 - 图片的操作
 - 图片的读取
 - 图片的写入
 - 示例代码
 
- 视频的操作
 - 打开视频
 - 关闭视频
 
- 总结
 
前言
在现代计算机视觉应用中,图像和视频处理起着至关重要的作用。这些应用范围广泛,包括图像识别、物体跟踪、3D建模等。为了实现这些功能,我们需要使用强大的工具和库。OpenCV(开源计算机视觉库)就是其中之一,它提供了大量的函数和模块,可以处理图像和视频数据。另一方面,Qt是一个用于开发GUI应用程序的框架,它的强大之处在于其跨平台性和易用性。结合这两个工具,我们可以创建出强大的图像和视频处理应用程序。
在本文中,我们将探讨如何使用Qt和OpenCV进行图像和视频的操作。我们将介绍一些基本的操作,如读取和显示图像,捕获和播放视频,以及一些更复杂的操作,如图像处理和视频分析。
图片的操作
图片的读取
imread函数
函数原型:
cv::Mat cv::imread(const std::string& filename, int flags = IMREAD_COLOR)
 
参数:
filename:要读取的图像文件的名称。flags:指定图像应如何被读取的标志。可能的值包括:cv::IMREAD_COLOR:加载彩色图像。任何图像的透明度都会被忽视。这是默认参数。cv::IMREAD_GRAYSCALE:以灰度模式加载图像。cv::IMREAD_UNCHANGED:加载图像,包括alpha通道。
返回值:返回一个cv::Mat对象,该对象包含了图像的数据。
图片的写入
imwrite函数
函数原型:
bool cv::imwrite(const std::string& filename, const cv::Mat& img, const std::vector<int>& params = std::vector<int>())
 
参数:
filename:要写入的图像文件的名称。img:要写入的图像。params:对于特定格式的参数的向量,例如对于JPEG,可以通过传递两个参数[cv::IMWRITE_JPEG_QUALITY, 90]来控制图像的质量。
返回值:如果图像被成功写入文件,则返回true;否则,返回false。
示例代码
以下是一个使用imread和imwrite的示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 使用imread函数读取图像cv::Mat img = cv::imread("input.jpg", cv::IMREAD_COLOR);if (img.empty()) {std::cout << "Could not open or find the image" << std::endl;return -1;}// 对图像进行一些操作...// ...// 使用imwrite函数写入图像if (!cv::imwrite("output.jpg", img)) {std::cout << "Could not write the image" << std::endl;return -1;}return 0;
}
 
在这个示例中,我们首先使用imread函数读取一个图像文件,然后对图像进行一些操作,最后使用imwrite函数将结果写入一个新的图像文件。注意,你需要确保输入图像文件存在,且程序有权限在指定位置写入文件。否则,imread和imwrite函数可能会失败。如果函数失败,它们会返回一个空的cv::Mat或false,你可以检查这些返回值来处理错误。。
视频的操作
打开视频
打开视频 VideoCapture类用于从摄像头或文件捕获视频。要从文件打开视频,你可以在创建VideoCapture对象时传递文件名作为参数。例如:
cv::VideoCapture cap("video.mp4");
 
你可以使用isOpened方法检查视频是否成功打开:
if (!cap.isOpened()) {std::cout << "Error opening video file" << std::endl;return -1;
}
 
然后,你可以使用read方法在循环中读取视频帧:
 read的函数原型:
bool read (OutputArray image)
 
参数为你需要这帧保存的位置
返回值:false 如果没有抓取帧
cv::Mat frame;
while(cap.read(frame)) {// 对帧进行处理...
}
 
示例代码:
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 使用VideoCapture打开视频cv::VideoCapture cap("video.mp4");if (!cap.isOpened()) {std::cout << "Error opening video file" << std::endl;return -1;}cv::Mat frame;while (cap.read(frame)) {// 对帧进行处理,例如显示帧cv::imshow("Frame", frame);// 按ESC键退出char c = (char)cv::waitKey(25);if (c == 27) {break;}}cap.release();cv::destroyAllWindows();return 0;
} 
关闭视频
写入视频 要写入视频,你需要创建一个VideoWriter对象。在创建VideoWriter对象时,你需要指定输出文件名、编码器、帧率和帧大小。例如:
构造函数的函数原型:
cv::VideoWriter::VideoWriter	(	const String & 	filename,
int 	apiPreference,
int 	fourcc,
double 	fps,
const Size & 	frameSize,
const std::vector< int > & 	params 
)	
 
filename:这是一个字符串,表示要创建的视频文件的名称。
apiPreference:这是一个整数,用于指定首选的捕获API后端。一些常见的值包括cv::CAP_ANY(自动选择),cv::CAP_FFMPEG(使用FFmpeg库),cv::CAP_GSTREAMER(使用GStreamer库)等。如果你不确定应该使用哪个值,可以使用cv::CAP_ANY让OpenCV自动选择。
fourcc:这是一个整数,表示用于压缩视频的四字符代码(Four-Character Codes)。你可以使用cv::VideoWriter::fourcc函数来获取这个值。例如,cv::VideoWriter::fourcc(‘M’,‘J’,‘P’,‘G’)返回一个用于Motion-JPEG编码的fourcc代码。
fps:这是一个双精度浮点数,表示视频的帧率,即每秒钟的帧数。
frameSize:这是一个cv::Size对象,表示视频帧的大小。例如,cv::Size(640, 480)表示帧的宽度为640像素,高度为480像素。
params:这是一个整数向量,包含特定于编解码器的参数。例如,对于Motion-JPEG编码器,你可以通过std::vector<int>
 {cv::IMWRITE_JPEG_QUALITY, 90}来设置JPEG质量为90(范围为0到100)。
cv::VideoWriter writer("output.mp4", cv::VideoWriter::fourcc('M','J','P','G'), 30, cv::Size(640, 480));
 
在这个例子中,我们使用fourcc函数指定了一个’MJPG’编码器。然后,你可以使用write方法将帧写入视频:
writer.write(frame);
 
最后,当你完成视频写入时,VideoWriter对象会在其析构函数中自动关闭文件。你也可以调用release方法手动关闭文件。
总结
通过本文,我们了解了如何使用Qt和OpenCV进行图像和视频的操作。我们学习了如何读取和显示图像,如何捕获和播放视频,以及如何进行一些基本的图像处理和视频分析。尽管我们只是涉及了这些主题的表面,但我们希望这足以激发你的兴趣,使你能够进一步探索这两个强大的工具。
Qt和OpenCV的结合为开发复杂的计算机视觉应用提供了巨大的可能性。无论你是一个有经验的开发者,还是一个刚刚开始接触这个领域的新手,我都鼓励你深入研究这些工具,发掘它们的潜力。
相关文章:
【Qt+opencv】图片与视频的操作
文章目录 前言图片的操作图片的读取图片的写入示例代码 视频的操作打开视频关闭视频 总结 前言 在现代计算机视觉应用中,图像和视频处理起着至关重要的作用。这些应用范围广泛,包括图像识别、物体跟踪、3D建模等。为了实现这些功能,我们需要…...
Kubernetes面试整理-PersistentVolumes和PersistentVolumeClaims的使用和配置
在 Kubernetes 中,PersistentVolumes (PV) 和 PersistentVolumeClaims (PVC) 提供了一种分离存储和使用存储的机制。PV 是集群中存储资源的抽象表示,而 PVC 是用户对存储资源的请求。通过这种机制,用户可以动态地申请和管理存储资源。 PersistentVolumes (PV) PersistentVol…...
C++学习全教程(Day2)
一、数组 在程序中为了处理方便,常常需要把具有相同类型的数据对象按有序的形式排列起来,形成“一组”数据,这就是“数组”(array) 数组中的数据,在内存中是连续存放的,每个元素占据相同大小的空间,就像排…...
Transformer详解encoder
目录 1. Input Embedding 2. Positional Encoding 3. Multi-Head Attention 4. Add & Norm 5. Feedforward Add & Norm 6.代码展示 (1)layer_norm (2)encoder_layer1 最近刚好梳理了下transformer,今…...
ISO 19110操作要求类/req/operation/signature的详细解释
/req/operation/signature 要求: 每个要素操作实体必须有且仅有一个在要素目录范围内唯一的“signature”属性。 附注: 签名(signature)指定了操作的名称和调用该操作所需的参数名称。 具体解释 定义 要素操作实体(feature operation …...
理解GPT2:无监督学习的多任务语言模型
目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据,更大的模型 2、大数据量,大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…...
深度学习11-20
1.神经元的个数对结果的影响: (http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html) (1)神经元3个的时候 (2)神经元是10个的时候 神经元个数越多,可能会产生…...
耐磨材料元宇宙:探索未来科技的无限可能
随着科技的不断发展,我们正逐渐进入一个全新的时代——元宇宙。在这个虚拟世界中,人们可以自由地创造、探索和交流。而在元宇宙中,耐磨材料作为一种重要的基础资源,将为我们的虚拟世界带来更多的可能性。 一、耐磨材料在元宇宙中…...
力扣2874.有序三元组中的最大值 II
力扣2874.有序三元组中的最大值 II 遍历j –> 找j左边最大数 和右边最大数 class Solution {public:long long maximumTripletValue(vector<int>& nums) {int n nums.size();vector<int> suf_max(n1,0);//右边最大数for(int in-1;i>1;i--){suf_max[i…...
Linux-笔记 嵌入式gdb远程调试
目录 前言 实现 1、内核配置 2、GDB移植 3、准备调试程序 4、开始调试 前言 gdb调试器是基于命令行的GNU项目调试器,通过gdb工具我们可以实现许多调试手段,同时gdb支持多种语言,兼容性很强。 在桌面 Linux 系统(如 Ubuntu、Cent…...
观测云产品更新 | Pipelines、智能监控、日志数据访问等
观测云更新 Pipelines 1、Pipelines:支持选择中心 Pipeline 执行脚本。 2、付费计划与账单:新增中心 Pipeline 计费项,统计所有命中中心 Pipeline 处理的原始日志的数据大小。 监控 1、通知对象管理:新增权限控制。配置操作权…...
docker 拉取不到镜像的问题:拉取超时
如果每次拉取的时候遇到超时 error pulling image configuration: download failed after attempts6: dial tcp 31.13.94.10:443: i/o timeout 解决方法如下: 设置国内镜像源: sudo mkdir -p /etc/docker 然后 sudo gedit /etc/docker/daemon.json 或…...
防火墙双机热备
防火墙双机热备 随着移动办公、网上购物、即时通讯、互联网金融、互联网教育等业务蓬勃发展,网络承载的业务越来越多,越来越重要。所以如何保证网络的不间断传输成为网络发展过程中急需解决的一个问题。 防火墙部署在企业网络出口处,内外网之…...
30分钟学习如何搭建扩散模型的运行环境【pytorch版】【B站视频教程】【解决环境搭建问题】
30分钟学习如何搭建扩散模型的运行环境【B站视频教程】【解决环境搭建问题】 动手学习扩散模型 点击以下链接即可进入学习: B站视频教程附赠:环境配置安装(配套讲解文档) 视频 讲解主要内容 一、环境设置 1.本地安装…...
使用Java连接数据库并且执行数据库操作和创建用户登录图形化界面(1)
创建一个Java程序,建立与本机mysql服务器上student数据库的连接,实现在tb_student学生表上插入一条学生信息:学号21540118,姓名王五,性别男,出生日期2003-12-10,所在学院5。 使用JDBC连接数据库…...
HarmonyOS Next开发学习手册——弹性布局 (Flex)
概述 弹性布局( Flex )提供更加有效的方式对容器中的子元素进行排列、对齐和分配剩余空间。常用于页面头部导航栏的均匀分布、页面框架的搭建、多行数据的排列等。 容器默认存在主轴与交叉轴,子元素默认沿主轴排列,子元素在主轴…...
centOS7网络配置_NAT模式设置
第一步:查看电脑网卡 nat模式对应本地网卡的VMnet 8 ,查看对应的IP地址。 第二步:虚拟网络编辑器 打开VMWare,编辑--虚拟网络编辑器,整个都默认设置好了,只需要查看对应的DHCP设置中对应的IP的起始&#…...
喜报 | 极限科技获得北京市“创新型”中小企业资格认证
2024年6月20日,北京市经济和信息化局正式发布《关于对2024年度4月份北京市创新型中小企业名单进行公告的通知》,极限数据(北京)科技有限公司凭借其出色的创新能力和卓越的企业实力,成功获得“北京市创新型中小企业”的…...
整合Spring Boot和Pulsar实现可扩展的消息处理
整合Spring Boot和Pulsar实现可扩展的消息处理 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在现代分布式系统中,消息队列是实现异步通信和解耦…...
如何给WPS、Word、PPT等办公三件套添加收费字体---方正仿宋GBK
1.先下载需要的字体。 下载字体的网站比较多,基本上都是免费的。随便在网上搜索一个就可以了,下面是下载的链接。 方正仿宋GBK字体免费下载和在线预览-字体天下 www.fonts.net.cn/font-31602268591.html 注意:切记不要商用,以免…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
