【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

示例代码

以下是一个使用imreadimwrite的示例代码:

#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函数将结果写入一个新的图像文件。注意,你需要确保输入图像文件存在,且程序有权限在指定位置写入文件。否则,imreadimwrite函数可能会失败。如果函数失败,它们会返回一个空的cv::Matfalse,你可以检查这些返回值来处理错误。。

视频的操作

打开视频

打开视频 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的结合为开发复杂的计算机视觉应用提供了巨大的可能性。无论你是一个有经验的开发者,还是一个刚刚开始接触这个领域的新手,我都鼓励你深入研究这些工具,发掘它们的潜力。

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

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

相关文章

Linux多进程和多线程(二)-进程间通信-管道用法

进程间通信 关于多进程的通信管道无名管道(匿名管道)创建无名管道示例:创建子进程,父进程通过管道向子进程发送消息无名管道(匿名管道) 的特点 有名管道(命名管道) 创建有名管道需要调⽤ mkfifo() 函数示例:创建两个没有关联关系的进程,通过有名管道通信 注意: 缺点优点 关于判…

Linux多进程和多线程(一)-进程的概念和创建

进程 进程的概念进程的特点如下进程和程序的区别LINUX进程管理 getpid()getppid() 进程的地址空间虚拟地址和物理地址进程状态管理进程相关命令 ps toppstreekill 进程的创建 并发和并行fork() 父子进程执行不同的任务创建多个进程 进程的退出 exit()和_exit() exit()函数让当…

七日世界Once Human跳ping、延迟高、丢包怎么办?

七日世界是一款开放世界为轴点的生存射击游戏&#xff0c;玩家将进入一个荒诞、荒芜的末日世界&#xff0c;在这里与好友一起对抗可怖的怪物和神秘物质星尘的入侵&#xff0c;给这个星球留下最后的希望&#xff0c;共筑一片安全的领地。不过有部分玩家在游玩七日世界的时候&…

探索 TensorFlow 模型的秘密:TensorBoard 详解与实战

简介 TensorBoard 是 TensorFlow 提供的可视化工具&#xff0c;帮助开发者监控和调试机器学习模型。它提供了多种功能&#xff0c;包括查看损失和精度曲线、可视化计算图、检查数据分布等。下面将介绍如何使用 TensorBoard。 1. 安装 TensorBoard 如果尚未安装 TensorBoard&…

昇思MindSpore学习笔记7--函数式自动微分

摘要&#xff1a; 介绍了昇思MindSpore神经网络训练反向传播算法中函数式自动微分的使用方法和步骤。包括构造计算函数和神经网络、grad获得微分函数&#xff0c;以及如何处理停止渐变、获取辅助数据等内容。 一、概念要点 神经网络训练主要使用反向传播算法&#xff1a; 准备…

从AICore到TensorCore:华为910B与NVIDIA A100全面分析

华为NPU 910B与NVIDIA GPU A100性能对比&#xff0c;从AICore到TensorCore&#xff0c;展现各自计算核心优势。 AI 2.0浪潮汹涌而来&#xff0c;若仍将其与区块链等量齐观&#xff0c;视作炒作泡沫&#xff0c;则将错失新时代的巨大机遇。现在&#xff0c;就是把握AI时代的关键…

如何使用 asyncio.log 启用 Debug 日志

如何使用 asyncio.log 启用 Debug 日志 1. 导入必要的模块2. 配置日志记录3. 启用 asyncio 的调试日志4. 示例代码总结 在 Python 中使用 asyncio 模块时&#xff0c;有时我们需要查看调试日志来了解程序的运行情况。本文将介绍如何使用 asyncio.log 启用调试日志。 1. 导入必…

RAG 基本流程及处理技巧 with LangChain

LLM 主要存在两个问题&#xff1a;幻想和缺乏领域知识。领域知识缺乏的原因是因为训练 LLM 本身的知识更新慢&#xff0c;对特定领域的知识也没有太细致的输入。 RAG 主要是解决 LLM 缺乏领域知识的问题。底层的逻辑是&#xff1a;把 LLM 作为逻辑推理引擎&#xff0c;而不是信…

点云处理实操 积分图进行法线估计

目录 一、概述 二、什么是积分图 三、如何利用积分图进行法线估计 四、demo演示 1、使用c++实现 2、使用PCL实现 一、概述 三种法线估计方法 1、通过通过局部平面来拟合局部平面 COVARIANCE_MATRIX 模式从具体某个点的局部邻域的协方差矩阵创建9个积分,来计算这个点的法…

Github 2024-06-30 php开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10Symfony PHP框架和组件 创建周期:5130 天开发语言:PHP协议类型:MIT LicenseStar数量:28999 个Fork数量:9440 次关注人数:28999 …

机器学习--概念理解

知识点 一、机器学习概述 人工智能 机器学习 深度学习 学习的范围&#xff1a;模式识别、数据挖掘、统计学习、计算机视觉、语音识别、自然语言处理 可以解决的问题&#xff1a;给定数据的预测问题 二、机器学习的类型 监督学习 分类 回归 无监督学习 聚类 降维 强化…

【2024】LeetCode HOT 100——回溯

目录 1. 全排列1.1 C++实现1.2 Python实现1.3 时空分析2. 子集2.1 C++实现2.2 Python实现2.3 时空分析3. 电话号码的字母组合3.1 C++实现3.2 Python实现3.3 时空分析4. 组合总和4.1 C++实现4.2 Python实现4.3 时空分析5. 括号生成5.1 C++实现5.2 Python实现5.3 时空分析6. 单词…

恢复的实现技术-日志和数据转储

一、引言 在系统正常运行的情况下&#xff0c;事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备&#xff0c;保证在系统发生故障后&#xff0c;能将数据库从一个不一致的错误状态恢复到一个一致性状态 恢复技术主要包括 生成一个数据库日志&#xff0c;来记录系统中…

Unity制作一个简单抽卡系统(简单好抄)

业务流程&#xff1a;点击抽卡——>播放动画——>显示抽卡面板——>将随机结果添加到面板中——>关闭面板 1.准备素材并导入Unity中&#xff08;包含2个抽卡动画&#xff0c;抽卡结果的图片&#xff0c;一个背景图片&#xff0c;一个你的展示图片&#xff09; 2.给…

创建一个vue3+vite+ts项目

目录 创建项目 ​编辑 下载jsx 插件 在根目录在新建.env vue.config.js tsconfig.json tsconfig.node.json 下载ui组件库和路由&#xff08;组件库根据自己的项目需要选择&#xff09; 在根目录下新建views/index.tsx 在根目录下新建router/index.ts 修改App.vue 创建…

机器学习原理之 -- 朴素贝叶斯分类器:由来及原理详解

朴素贝叶斯&#xff08;Naive Bayes&#xff09;分类器是一类基于贝叶斯定理&#xff08;Bayes Theorem&#xff09;的简单而有效的概率分类算法。由于其假设特征之间的条件独立性&#xff0c;因此被称为“朴素”贝叶斯分类器。尽管这种独立性假设在现实中很少完全成立&#xf…

mac系统docker默认不支持host主机网络模式

环境描述&#xff1a;在mac系统上安装docker及docker-compose服务&#xff0c;并且打算搭建一个redis集群 问题描述&#xff1a;mac默认不支持host网络模式&#xff0c;导致集群无法通过外部主机访问 具体验证步骤&#xff1a; docker-compose.yml如下&#xff1a; version…

reactor网络模型的原理与实现

一、rector网络模型 对高并发编程&#xff0c;网络连接上的消息处理&#xff0c;可以分为两个阶段&#xff1a;等待消息准备好、消息处理。当使用默认的阻塞套接字时&#xff0c;往往是把这两个阶段合而为一&#xff0c;这样操作套接字的代码所在的线程就得睡眠来等待消息准备好…

Mysql常用SQL:日期转换成周_DAYOFWEEK(date)

有时候需要将查询出来的日期转换成周几&#xff0c;Mysql本身语法就是支持这种转换的&#xff0c;就是DAYOFWEEK()函数 语法格式&#xff1a;DAYOFWEEK(date) &#xff08;date&#xff1a;可以是指定的具体日期&#xff08; 如2024-06-29 &#xff09;&#xff0c;也可以是日期…

ubuntu中安装pycharm并设置图标

下载并解压 下载PyCharm&#xff1a;从JetBrains官网下载PyCharm的tar.gz文件。 地址&#xff1a;PyCharm&#xff1a;适用于数据科学和 Web 开发的 Python IDE (jetbrains.com) 解压文件&#xff1a;使用以下命令解压下载的文件&#xff1a; tar xvf pycharm-community-*.tar…