当前位置: 首页 > article >正文

opencv入门1.1:从视频或摄像头读取图像

cv::VideoCapture是 OpenCV 中用于从视频文件或摄像头捕获图像帧的类。它提供了各种方法和函数,用于读取和处理视频数据。

以下是对 cv::VideoCapture类的详细解释和说明:

1. 打开视频源

为了使用 cv::VideoCapture,我们首先需要打开一个视频源。可以通过以下方式打开不同类型的视频源:

- 使用视频文件打开:可以通过传递视频文件的路径作为参数,例如:capture.open("video.mp4");,将打开名为 "video.mp4" 的视频文件。
- 使用摄像头打开:可以通过传递摄像头的索引作为参数,例如:capture.open(0);,将打开索引为 0 的摄像头。

2. 检查是否成功打开

打开视频源后,我们需要检查是否成功打开。可以使用 isOpened() 方法来检查。

if (!capture.isOpened()) {
    // 处理打开失败的情况
    return -1;
}
3. 读取图像帧

读取视频中的图像帧需要使用 >>运算符或者 read() 方法。这将返回一个 cv::Mat 对象,其中包含了当前帧的图像数据。

cv::Mat frame;
capture >> frame;    // 使用 >> 运算符读取图像帧
// 或者
capture.read(frame); // 使用 read() 方法读取图像帧
4. 检查图像帧是否为空

在进行处理之前,应检查图像帧是否为空。

if (frame.empty()) {
    // 视频结束或者图像帧为空,退出循环
    break;
}
5. 播放图像帧

通过imshow()方法可以显示图像帧。

cv::imshow("Video", frame);
6. 延迟和键盘输入

为了以适当的速度播放视频帧,可以使用waitKey()方法添加适当的延迟和等待键盘输入。

if (cv::waitKey(delay) == 27) {
    // 按下 ESC 键退出循环
    break;
}
7. 关闭视频源

在完成视频处理后,需要释放资源,并关闭视频源。

cv::destroyAllWindows(); // 关闭所有显示窗口
capture.release();       // 释放视频源

以上是使用 cv::VideoCapture类的基本流程和常见操作。通过灵活运用这些方法和函数,我们可以读取视频源并处理其中的帧图像。

8.完整代码

以下是一段包含异常处理的完整C++代码,用于读取视频并逐帧显示使用OpenCV的功能:

#include <iostream>
#include <opencv2/opencv.hpp>

int main() {
    cv::VideoCapture capture;
    cv::Mat frame;

    try {
        capture.open("video.mp4"); // 替换为要读取的视频文件路径

        if (!capture.isOpened()) {
            throw std::runtime_error("无法打开视频文件");
        }

        while (true) {
            capture >> frame;

            if (frame.empty()) {
                break;
            }

            cv::imshow("Video", frame);
            
            // 按下 ESC 键退出循环
            if (cv::waitKey(30) == 27) {
                break;
            }
        }
    } catch (const std::exception& e) {
        std::cerr << "发生异常: " << e.what() << std::endl;
        return 1;
    }

    cv::destroyAllWindows();
    capture.release();
    
    return 0;
}

请确保已经安装了OpenCV,并将代码中的video.mp4替换为实际想要读取的视频文件路径。此代码包含了异常处理,它会在发生异常时输出错误消息并返回非零的退出码。

希望这段代码能够帮助到大家!如有任何问题,请留言提问。


http://www.kler.cn/a/146067.html

相关文章:

  • 解决 多层跳板机情况下,ssh可以成功连但是VSCode失败
  • 解锁辅助驾驶新境界:基于昇腾 AI 异构计算架构 CANN 的应用探秘
  • C++第十五讲:异常
  • 【论文笔记】SmileSplat:稀疏视角+pose-free+泛化
  • 第22篇 基于ARM A9处理器用汇编语言实现中断<四>
  • vscode 设置
  • 什么是单元测试?
  • 最火web大屏可视化编辑器
  • HTML新特性【缩放图像、图像切片、平移、旋转、缩放、变形、裁切路径、时钟、运动的小球】(二)-全面详解(学习总结---从入门到深化)
  • ubuntu20.04安装tensorRT流程梳理
  • CVPR 2023 精选论文学习笔记:Prefix Conditioning Unifies Language and Label Supervision
  • 业务流程图是什么,怎么画?
  • vue3+ts mitt的使用
  • 【海德教育】唐山每年成人高考的考试时间在什么时候?
  • mysql 变量和配置详解
  • MyBatis的解析和运行原理
  • element-ui DatePicker 日期选择器-控制选择精确到时分秒-禁止选择今天之前-或者今天之后日期### 前言
  • 电脑投屏到电视的软件,Mac,Linux,Win均可使用
  • 企业文档文件管理软件推荐:提升管理效率与数据安全性
  • 【腾讯云云上实验室】用向量数据库在金融信用数据库分析中的实战运用
  • 【element优化经验】el-dialog修改title样式
  • SpringCache使用详解
  • Web 自动化神器 TestCafe(三)—用例编写篇
  • Xilinx Zynq-7000系列FPGA实现视频拼接显示,提供两套工程源码和技术支持
  • 直播自动互动发言机器人,成功分享与技术实现思路
  • vscode中pylance无法显示outline无法跳转