文章目录

    • 一、第一个程序:显示图片
      • 1.1 cv::imread
      • 1.2 cv::namedWindow
      • 1.3 cv::imshow
    • 二、第二个程序:视频
      • 2.1 cv::VideoCapture
    • 三、加入了滑动条的基本浏览窗口

一、第一个程序:显示图片

示例:一个简单的加载并显示图像的OpenCV程序

#include <iostream>
#include "./opencv2/opencv.hpp"int main() {cv::Mat image = cv::imread("D:/opencv_demo.png");if (image.empty()) {std::cout << "could not load image..." << std::endl;return 0;}cv::namedWindow("opencv_demo", 0);cv::imshow("opencv_demo", image);cv::waitKey(0);return 0;
}

OpenCV提供了一些实用工具来读取从视频流到摄像机画面的各种各样的图像格式,这些工具都是HighGUI的一部分。我们将使用其中的一些工具来创建一个简单的程序,这个程序将打开一张图像并且将其显示在屏幕上。

1.1 cv::imread

函数原型:

cv::Mat cv::imread(const std::string &filename, int flags = cv::IMREAD_COLOR);

作用:cv::imread 是 OpenCV 中用于从文件读取图像的函数。它的作用是将图像文件读取为 cv::Mat 类型的矩阵,方便后续进行图像处理操作。

参数说明:
在这里插入图片描述
常用 flags 参数:
在这里插入图片描述
返回值:

  • 成功时返回一个包含图像数据的 cv::Mat 对象;
  • 如果文件不存在或无法读取,返回一个 空矩阵(可用 mat.empty() 检查)。

1.2 cv::namedWindow

函数原型:

void cv::namedWindow(const std::string &winname, int flags = cv::WINDOW_AUTOSIZE);

作用:cv::namedWindow 是 OpenCV 中用于创建一个图像显示窗口的函数,通常和 cv::imshow 搭配使用。它可以指定窗口的名称和一些属性,如是否可以调整大小等。

参数说明:
在这里插入图片描述

常用 flags 参数:
在这里插入图片描述

1.3 cv::imshow

函数原型:

void cv::imshow(const std::string &winname, cv::InputArray mat);

作用:cv::imshow 是 OpenCV 中用于 显示图像 的函数,常与 cv::namedWindow 和 cv::waitKey 搭配使用,是图像可视化的核心函数之一。

参数说明:
在这里插入图片描述

二、第二个程序:视频

示例:一个简单的播放视频文件的OpenCV程序

#include <iostream>
#include "./opencv2/opencv.hpp"int main() {// 尝试打开视频文件std::string videoPath = "video.mp4";cv::VideoCapture cap(videoPath);if (!cap.isOpened()) {std::cerr << "无法打开视频文件:" << videoPath << std::endl;std::cerr << "请检查文件路径是否正确,是否存在视频文件。" << std::endl;return -1;}// 创建显示窗口cv::namedWindow("视频播放", cv::WINDOW_NORMAL);cv::Mat frame;while (true) {// 读取一帧bool success = cap.read(frame);if (!success || frame.empty()) {std::cout << "视频播放完毕或读取失败。" << std::endl;break;}// 显示当前帧cv::imshow("视频播放", frame);// 每 25ms 等待一次按键(按 ESC 键退出)char key = (char)cv::waitKey(25);if (key == 27) break;  // ESC}// 释放资源cap.release();cv::destroyAllWindows();return 0;
}

2.1 cv::VideoCapture

cv::VideoCapture 是 OpenCV 中用于 读取视频数据源 的类,既可以用来读取视频文件,也可以从摄像头中实时采集图像帧,是处理视频流的核心组件之一。

常见构造方式:

cv::VideoCapture cap;                  // 空对象,后续调用 open()
cv::VideoCapture cap(0);              // 打开默认摄像头
cv::VideoCapture cap("video.mp4");    // 打开视频文件

也可以使用 .open(…) 动态打开源:

cv::VideoCapture cap;
cap.open("video.mp4");

常用函数说明:
在这里插入图片描述

打开摄像头示例:

cv::VideoCapture cap(0);  // 0 表示默认摄像头
if (!cap.isOpened()) {std::cerr << "无法打开摄像头!" << std::endl;return -1;
}

获取常用视频属性:

double width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
double height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
double fps = cap.get(cv::CAP_PROP_FPS);
double totalFrames = cap.get(cv::CAP_PROP_FRAME_COUNT);

常见属性 ID(用于 get() / set()):
在这里插入图片描述

三、加入了滑动条的基本浏览窗口

在 OpenCV 中,如果你想播放视频或浏览图像,并添加滑动条(trackbar)来控制帧数或图像编号,可以使用 cv::createTrackbar() 来实现。

示例:下面是一个带滑动条的基本视频浏览器示例,用户可以通过滑动条选择播放哪一帧

#include <iostream>
#include "./opencv2/opencv.hpp"cv::VideoCapture cap;
int totalFrames = 0;
int currentFrame = 0;// 滑动条回调函数
void onTrackbarSlide(int pos, void*) {cap.set(cv::CAP_PROP_POS_FRAMES, pos);  // 跳转到对应帧cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("视频浏览器", frame);}
}int main() {cap.open("video.mp4");  // 读取视频文件if (!cap.isOpened()) {std::cerr << "无法打开视频文件!" << std::endl;return -1;}totalFrames = (int)cap.get(cv::CAP_PROP_FRAME_COUNT);cv::namedWindow("视频浏览器", cv::WINDOW_NORMAL);cv::createTrackbar("位置", "视频浏览器", &currentFrame, totalFrames - 1, onTrackbarSlide);// 显示第一帧onTrackbarSlide(0, nullptr);// 等待按键退出while (true) {int key = cv::waitKey(0);if (key == 27) break;  // ESC 键退出}cap.release();cv::destroyAllWindows();return 0;
}

函数原型:

int cv::createTrackbar(const std::string &trackbarname,const std::string &winname,int *value,int count,TrackbarCallback onChange = 0,void* userdata = 0
);

参数说明:
在这里插入图片描述

加上“播放/暂停控制”的滑动条视频浏览器示例

#include "./opencv2/opencv.hpp"
#include <iostream>cv::VideoCapture cap;
int totalFrames = 0;
int currentFrame = 0;
bool isPlaying = false;// 滑动条回调函数
void onTrackbarSlide(int pos, void*) {cap.set(cv::CAP_PROP_POS_FRAMES, pos);cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("视频浏览器", frame);}currentFrame = pos;
}int main() {cap.open("video.mp4");if (!cap.isOpened()) {std::cerr << "无法打开视频文件!" << std::endl;return -1;}totalFrames = (int)cap.get(cv::CAP_PROP_FRAME_COUNT);cv::namedWindow("视频浏览器", cv::WINDOW_NORMAL);cv::createTrackbar("位置", "视频浏览器", &currentFrame, totalFrames - 1, onTrackbarSlide);onTrackbarSlide(0, nullptr);  // 显示第一帧while (true) {if (isPlaying) {if (currentFrame < totalFrames - 1) {currentFrame++;cap.set(cv::CAP_PROP_POS_FRAMES, currentFrame);cv::Mat frame;cap.read(frame);if (!frame.empty()) {cv::imshow("视频浏览器", frame);cv::setTrackbarPos("位置", "视频浏览器", currentFrame);}cv::waitKey(30);  // 控制播放速度(帧率)} else {isPlaying = false;  // 到结尾停止}}int key = cv::waitKey(30);if (key == 27) break;               // ESC 退出else if (key == ' ') isPlaying = !isPlaying; // 空格键播放/暂停else if (key == 'r') onTrackbarSlide(0, nullptr); // r 键重播}cap.release();cv::destroyAllWindows();return 0;
}

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

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

相关文章

第14次:商品列表、热销商品及详情

第1步&#xff1a;定义获取商品列表的视图类ListView&#xff0c;本视图中完成了如下功能&#xff1a; 根据商品类别id获取商品类别信息&#xff0c;并根据类别信息反向查询到所有的该类别的商品。根据页号和排序方式两个参数&#xff0c;获取某个页面的商品列表信息。 #good…

基于双层注意力重加权 LSTM 的中文长文本谣言检测模型

文章目录 1.摘要2.介绍3.相关工作3.1 假新闻检测数据集3.2 假新闻检测方法3.3 长文本假新闻检测的挑战与进展3.4 与现有方法的区别 4.方法4.1 模型结构4.2模型代码4.3 损失函数与优化方法 5. 实验5.1 数据集与预处理5.2 实验设置5.3 实验结果5.4 对比分析5.5 结果分析与讨论 6.…

在 MyBatis 的xml中,什么时候大于号和小于号可以不用转义

在 MyBatis 中&#xff0c;< 和 > ​在动态 SQL 标签内部​ 无需转义的功能是在以下版本引入的&#xff1a; &#x1f4cc; 关键版本说明 版本支持情况注意事项​MyBatis 3.3.0​​✅ 在 <if>、<where>、<set> 等动态 SQL 标签内部可直接使用 < 和…

Redis 的穿透、雪崩、击穿

Redis 的穿透、雪崩、击穿 1、缓存穿透 定义 缓存穿透是指查询一个不存在的数据&#xff0c;由于缓存中没有该数据&#xff0c;每次请求都会直接访问数据库&#xff0c;导致数据库压力过大 产生原因 恶意攻击&#xff1a;攻击者故意请求大量不存在的key&#xff0c;导致请求直…

有道翻译官手机版:智能翻译,随行助手

在当今全球化的时代&#xff0c;语言不再是交流的障碍。无论是学习外语、出国旅游、商务出差还是日常交流&#xff0c;一款高效、准确的翻译软件都能成为我们的好帮手。有道翻译官手机版正是这样一款功能强大、操作便捷的语言翻译软件&#xff0c;它凭借先进的翻译技术和丰富的…

nuxt3 + vue3 分片上传组件全解析(大文件分片上传)

本文将详细介绍一个基于 Vue.js 的分片上传组件的设计与实现,该组件支持大文件分片上传进度显示等功能。 组件概述 这个上传组件主要包含以下功能: 支持大文件分片上传(默认5MB一个分片)支持文件哈希计算,用于文件唯一标识显示上传进度(整体和单个文件)支持自定义UI样…

正则表达式与C++

转自个人博客 1. 概述 1.1 正则表达式概述 正则表达式&#xff08;Regular Expressions&#xff0c;简称 regex&#xff09;是用于匹配文本模式的一种特殊字符序列&#xff0c;其可以用一系列字符来表示出不同文本的对应模式。正则表达式的应用范围十分广泛&#xff0c;包括验…

OpenCV CUDA模块设备层-----在 GPU上计算反双曲正切函数atanh()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对输入的 uchar1 像素值&#xff08;范围 [0, 255]&#xff09;&#xff0c;先归一化到 [0.0, 1.0] 浮点区间&#xff0c;然后计算其 反双曲正切…

抢占西南产业高地:入驻成都芯谷金融中心文化科技产业园的价值

入驻成都芯谷金融中心文化科技产业园&#xff0c;对企业而言具有显著的战略价值&#xff0c;主要体现在以下几个方面&#xff1a; 产业聚集效应与协同发展 产业链完善&#xff1a;成都芯谷聚焦集成电路、新型显示、人工智能等核心产业&#xff0c;入驻企业可享受完善的产业链…

领域驱动设计(DDD)【2】之项目启动与DDD基本开发流程

文章目录 一 项目背景与目标二 核心需求分析初步需求详细分析需求总结表 三 DDD核心概念与开发流程领域和领域专家领域驱动设计开发流程 四 潜在扩展需求 一 项目背景与目标 项目定位 开发基于SaaS的企业管理系统&#xff0c;聚焦软件服务企业的细分市场&#xff0c;功能需求包…

深度融合数智化,百胜软件联合华为云加速零售行业转型升级

当前&#xff0c;企业数字化转型纵深推进&#xff0c;满足企业数智化全阶段、全场景的需求变得尤为关键。为此&#xff0c;华为云携手上万家伙伴共同发起第三届828 B2B企业节&#xff0c;依托云底座为企业数智化供需“架桥”“铺路”&#xff0c;加速企业智改数转&#xff0c;助…

《HTTP权威指南》 第4章 连接管理

带着问题学习&#xff08;通常是面试考点&#xff09; HTTP是如何使用TCP连接的TCP连接的时延、瓶颈及存在的障碍HTTP的优化&#xff0c;包括并行连接、keep-alive&#xff08;持久连接&#xff09;和管道化连接管理连接时应该和不应该做的事 TCP连接 TCP的数据通过IP分组&am…

StartUML入门级使用教程——画Class类图

一、破解安装StartUML StarUML建模工具最新版破解安装详细教程https://blog.csdn.net/m0_74146638/article/details/148709643?spm1001.2014.3001.5502 二、类图实战 1.主界面 ​ 默认打开starUML后&#xff0c;会默认进入类图模式&#xff0c;各模块区域功能如下&#x…

中科亿海微SoM模组——FPGA+DSP核心板

FPGADSP核心板是基于中科亿海微EQ6HL130型FPGA芯片搭配国产DSP开发的高性能核心板卡。对外接口采取邮票孔连接方式&#xff0c;可以极大提高信号传输质量和焊接后的机械强度。核心板卡的系统框图如下图所示。 图 FPGADSP核心板系统框图 FPGA采用中科亿海微136K LUT资源EQ6HL130…

CentOS 7 虚拟机网络配置异常 典型问题:启动了NetworkManager但是network无法启动

问题背景 在 VMware 虚拟机中使用 CentOS 7 时&#xff0c;出现以下网络问题&#xff1a; 命令行重启网络服务失败&#xff0c;提示 RTNETLINK answers: File exists 等冲突错误图形界面网络设置无法打开&#xff0c;提示需要启动 NetworkManager网卡 ens33 无法获取 IPv4 地…

细节/数学/滑动窗口

题目意思&#xff1a; 判断字符串是否可以按照题目条件缩短。 思路&#xff1a; 用栈的思想写&#xff0c;对每一次的大小写都进行滚动判断。 tips&#xff1a; 这里面要注意的东西就有一点多了&#xff0c;首先是字符串的遍历问题auto更方便&#xff0c;其次是对小写和大…

WebeServer实现:学到了哪些东西

前言 这里话就是总结一下之前没讲过的一些东西 系统调用 accept与accept4   当我们调用accept接收一个新的fd的时候&#xff0c;往往需要在调用fcntl将这个fd变成非阻塞IO,那么有没有一个系统调用可以一次性做完这两件事呢&#xff0c;有的有的就是accept4. // accept 函数…

React 虚拟dom

JSX创建出ReactElement对象 最终形成一个JS树 将React.createElement对象转为真实DOM的方法使用render函数 为什么要虚拟 dom 状态难以跟踪 ## 操作真实dom开销大 &#xff0c;并且操作会引起频繁的回流和重绘&#xff0c;并且不涉及批处理 声明式编程 从虚拟dom向真实dom去…

Spring MVC异常处理机制

Spring MVC提供了多种异常处理机制,以下是核心处理方式及实现方法: 一、局部异常处理(Controller级别) @ExceptionHandler注解 在Controller内部定义异常处理方法,捕获当前控制器抛出的指定异常。@Controller public class UserController {@GetMapping("/test"…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(一):MGR构建MySQL高可用

#作者&#xff1a;stackofumbrella 文章目录 简介MGR优点MGR缺点MGR适用场景单主模式和多主模式组复制介绍组复制插件架构图单主模式多主模式配置主机名解析安装MGR插件 MGR故障转移恢复MGR集群 简介 MGR&#xff08;MySQL Group Replication&#xff09;是MySQL 5.7.17版本诞…