Opencv 视频帧的读写处理指导

2023-11-07

Opencv 视频帧的读写指导

思路指导

1.先打开视频文件
2.遍历视频帧
3.处理视频帧
4.保存所有的视频帧

1.打开视频

1.当读取的是保存的视频时,打开视频的方法为:

cv::VideoCapture    capture("视频名"); //将视频放到工程文件夹下
//或者
cv::VideoCapture    capture;
capture.open("视频名");               //将视频放到工程文件夹下

2.当读取的是摄像头采集的是视频帧时,打开视频的方法为:

cv::VideoCapture    capture(0);      //每个摄像头都有一个从0开始的索引号,0是默认的摄像头的索引号;当还需要打开一个摄像头时,第二个摄像头索引号为1,即cv::VideoCapture    capture(1);    

3.当读取的是一系列图片时,打开视频的方式为:

//读取goose124.bmp-----goose275.bmp的图片

char filename[500];
	cv::Mat frame;
	for (int i = 124; i < 275; i++)
	{
		sprintf_s(filename,500, "D:\\KDubaSoftDownloads\\keepvadio\\12.1Project1\\pc\\goose%d.bmp", i);
		frame = cv::imread(filename);
	    
		 cv::imshow("Board Image",frame);	                 //播放图片
		 cv::waitKey(300);                                   //两张图片间隔300ms
	}

2.遍历视频帧

1.当遍历的是视频时:

cv::VideoCapture  capture;
cv::Mat frame;
capture.read(frame);	//按顺序访问每一帧
cv::waitKey(delay)      //设置每一帧间隔

2.当遍历的是一批独立的储存图像时:

	cv::Mat frame;
    //设置输入对象的图像文件名向量
    std::vector<std::string> images;
	// 图像向量的迭代器
	std::vector<std::string>::const_iterator itImg;
	//将这个图像向量作为输入对象,取地址
	itImg = images.begin();
	
	if(itImg != images.end())
	{
		frame = cv::imread(*itImg);
		cv::imshow("image",frame);
		itImg++;
		
	}

3.处理视频帧

这时候我们需要一个函数(回调函数),让视频序列的每一帧都调用它。
在面向对象的编程中,最好是使用帧处理类而不是帧处理函数,实用类能提供很大的灵活性。

//定义一个接口函数类,(抽象类)
class FrameProcessor {

public:
	// 处理方法
	virtual void process(cv::Mat &input, cv::Mat &output) = 0;       //纯虚函数,在不确定其功能时使用纯虚函数。
};
//由于FrameProcessor是抽象类,process是纯虚函数,所以需要在另一个类中对process进行实例化
class VideoProcessor 
{
	private:
		void(*process)(cv::Mat&, cv::Mat&);

// 方便在调用在下面的函数中对其实例化
	void setFrameProcessor(void(*frameProcessingCallback)(cv::Mat&, cv::Mat&)
	 {

		// 对process实例化
		process = frameProcessingCallback;      //frameProcessingCallback处理函数
		
	 }
	
}
在读取每一帧后运行   process(frame, output)    就实现了对每一帧的处理。

4.保存所有的视频帧

Opencv用cv::VideoCapture 类写视频文件

cv::VideoWriter writer;
//读取视频帧速率
double getFrameRate() 
    {
		double r = capture.get(cv::CAP_PROP_FPS);
		return r;
	}
//读取视频帧的宽和高
cv::Size size = cv::Size((int)capture.get(cv::CAP_PROP_FRAME_WIDTH), (int)capture.get(cv::CAP_PROP_FRAME_HEIGHT));
//制作视频AVI空间
writer.open(
           "output.avi",       //命名输出的视频名
            cv::VideoWriter::fourcc('M', 'J', 'P', 'G'),   //编码器格式
            getFrameRate(),                    //视频帧速率,本次采用输入视频的视频帧速率
            size,                              //保存视频帧的大小,建议采用输入视频帧的大小,不然运行可能出问题
            false                              //彩色视频,true彩色视频,false不是彩色视频
  );
 //将读取的视频帧写入制作的视频空间  "output.avi"
writer << frame;

5.此次编程遇到的问题

1.setw()默认填充的内容为空格,可以setfill()配合使用设置其他字符填充。
如:
cout<<setfill(’&’)<<setw(5)<<‘a’<<endl;
则输出:
&&&&a //4个&和字符a共占5个位置。
所谓域宽,就是输出的内容(数值或字符等等)需要占据多少个字符的位置,如果位置有空余则会自动补足。比如我们要设置域宽为2,那么当输出一位数1的时候输出的就是“ 1”,即在1前面加了一个空格;那么当输出两位数12的时候输出的就是“12”,即在两个空格完全占用。
我 们在设置域宽和填充字符的时候要注意几点:
①设置域宽的时候应该填入整数,设置填充字符的时候应该填入字符。
②我们可以对一个要输出的内容同时设置域宽和 填充字符,但是设置好的属性仅对下一个输出的内容有效,之后的输出要再次设置。即 cout <<setw(2) <<a <<b;语句中域宽设置仅对a有效,对b无效。

③setw和setfill 被称为输出控制符,使用时需要在程序开头写上#include “iomanip.h”,否则无法使用。
2.
在函数前加 virtual 为虚函数,同时在函数尾部加 = 0 为纯虚函数
虚函数(impure virtual)
  C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现。
  子类可以重写父类的虚函数实现子类的特殊化。
  
纯虚函数(pure virtual)
  C++中包含纯虚函数的类,被称为是“抽象类”。抽象类不能使用new出对象,只有实现了这个纯虚函数的子类才能new出对象。
  C++中的纯虚函数更像是“只提供申明,没有实现”,是对子类的约束,是“接口继承”。
  C++中的纯虚函数也是一种“运行时多态”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv 视频帧的读写处理指导 的相关文章

  • 在加载“cv2”二进制扩展期间检测到递归

    我有一个小程序 在 pyinstaller 编译后返回 opencv 错误 但无需编译即可工作 我在 Windows 10 上使用 Python 3 8 10 Program 导入 pyautogui将 numpy 导入为 np导入CV2
  • 多视图几何

    我从相距一定距离的两台相同品牌的相机捕获了两张图像 捕获了相同的场景 我想计算两个相机之间的现实世界旋转和平移 为了实现这一点 我首先提取了两张图像的 SIFT 特征并进行匹配 我现在有基本矩阵也单应性矩阵 然而无法进一步进行 有很多混乱
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 使用 OpenCV 改进特征点匹配

    我想匹配立体图像中的特征点 我已经用不同的算法找到并提取了特征点 现在我需要一个良好的匹配 在本例中 我使用 FAST 算法进行检测和提取 BruteForceMatcher用于匹配特征点 匹配代码 vector lt vector
  • 如何确定与视频中物体的距离?

    我有一个从行驶中的车辆前面录制的视频文件 我将使用 OpenCV 进行对象检测和识别 但我停留在一方面 如何确定距已识别物体的距离 我可以知道我当前的速度和现实世界的 GPS 位置 但仅此而已 我无法对我正在跟踪的对象做出任何假设 我计划用
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • 如何使用 opencv.omnidir 模块对鱼眼图像进行去扭曲

    我正在尝试使用全向模块 http docs opencv org trunk db dd2 namespacecv 1 1omnidir html用于对鱼眼图像进行扭曲处理Python 我正在尝试适应这一点C 教程 http docs op
  • OpenCV:如何从网络摄像头获取原始 YUY2 图像?

    你知道如何获得吗raw YUY2来自网络摄像头的图像 使用 OpenCV DirectShow 无 VFW http opencv willowgarage com wiki CameraCapture http opencv willow
  • OpenCV 2.2 和多 CPU - opencv_haartraining.exe 是多线程的吗?

    我在 VS 2010 上构建了 OpenCV 2 2 启用了 TBB 3 支持 我确保所有项目都有正确的 tbb lib 目录 并将 tbb lib 列为依赖项 通过隐藏 tbb dll 进行验证 果然 haartraining exe 抱
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 深度估计的准确性 - 立体视觉

    我正在研究立体视觉 我对这个问题的深度估计的准确性感兴趣 这取决于几个因素 例如 适当的立体校准 旋转 平移和失真提取 图像分辨率 相机和镜头质量 失真越小 色彩捕捉正确 两个图像之间的匹配特征 假设我们没有低成本的相机和镜头 没有廉价的网
  • 开放简历fisherfaces

    我有这个问题 当我使用 vs2010 调试 opencv 2 4 0 facetec demo c 运行时 程序出现此错误 OpenCV错误 未知函数中图像步长错误 矩阵不连续 因此其行数无法更改 文件 src opencv modul e
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命

随机推荐

  • spring-boot,java 微服务,跨域配置

    只需要在启动类下面与run方法同级加上下面那串代码即可 public static void main String args SpringApplication run ApplicationService class args Over
  • Visual Studio 2019中使用Qt,步骤详解

    本文学习的目的就是在Visual Studio 2019环境下能够顺利的运行Qt程序 下面是一些具体的配置安装过程 首先 打开visual Studio 2019 继续但无需代码 如图 然后点击扩展 管理扩展 在搜索框中搜索Qt 点击下载插
  • 上个厕所的功夫,就把定时任务的三种调度策略说得明明白白

    Spring Task 无疑是 Spring 环境下单机定时任务的首选 它用起来非常简单 功能也够用 Spring Task 有三种模式 分别是 fixedDelay cron 和 fixedRate 话不多说 我们先看代码 Slf4j C
  • JUC多线程及高并发

    文章目录 1 对volatile的理解 2 CAS 3 原子类AtomicInteger的ABA问题 原子更新引用 4 ArrayList线程不安全的案例 5 公平锁 非公平锁 可重入锁 递归锁 自旋锁 6 CountDownLatch C
  • SpringBoot支付宝沙箱支付步骤

    步骤1 注册一个沙箱号 网站https open alipay com platform home htm 使用自己真实的支付宝扫描进去 进行注册沙箱支付宝 步骤2 下载密匙生成工具 下载完毕 解压 双击运行 网址 https opendo
  • 重磅:国产IDE发布,由阿里研发,完全开源!​(高性能+高定制性)

    经历近 3 年时间 在阿里集团及蚂蚁集团共建小组的努力下 OpenSumi 作为国内首个强定制性 高性能 兼容 VS Code 插件体系的 IDE 研发框架 今天正式对外开源 1 OpenSumi 是什么 OpenSumi 是一款面向垂直领
  • Lua点号和冒号区别

    定义的时候冒号默认接收self参数 调用的时候冒号默认传递调用者自己为参数 而句号要显示传递或接收self参数 例如 句号定义 需要显示传递或接收 plain view plain copy a x 1 function a fun sel
  • Python画QQ图检验正态分布

    import numpy as np import seaborn as sns import matplotlib pyplot as plt from statsmodels graphics api import qqplot sns
  • pip 安装 sklearn or scikit-learn python3

    安装 sklearn 1 安装 numpy scipy matplot pip3 install numpy scipy matplotlib i https pypi tuna tsinghua edu cn simple 2 安装 sk
  • Android序列化:Serializable Parcelable

    Android序列化完全解析 一 Java Serializable http http www jianshu com p fcc59fb523b6 Android序列化完全解析 二 Parcelable http www jianshu
  • 背对背mos管开关_10天电子入门-MOS管

    1 MOS管介绍 在各大IT企中我们把场效应管 FET 统称为MOS管 其作用是把输入电压的变化转化为输出电流的变化 FET的增益等于它的跨导 定义为输出电流的变化和输入电压变化之比 市面上常有的一般为N沟道和P沟道 它属于电压控制型半导体
  • uni-app 之 解决u-button始终居中问题

    uView中u button始终居中问题如何解决的简单方法 1 给该元素margin right 0 可以达到向右靠齐 2 给该元素的父元素设置float right image png
  • DF-GAN: A Simple and Effective Baseline for Text-to-Image Synthesis论文解读

    题目 DF GAN 一种简单有效的文本 图像合成基线 时间 2022 CVPR Abstract 从文字描述中合成高质量的逼真图像是一项具有挑战性的任务 现有的文本 图像生成对抗网络通常采用堆叠架构作为主干 但仍存在三个缺陷 首先 分层结构
  • open3d,读取stl/ply/obj/off/gltf/glb三维模型,并转换成点云,保存

    1 三维模型获取 可以自己用建模软件建立一个模型 本案例使用模型的下载地址 可以从free3d免费下载 无需注册 2 导入open3d import open3d as o3d 3 open3d模型读取与可视化 模型路径 支持后缀 stl
  • vim编辑器-设置默认行号和高级用法

    vim 自动显示行号 编辑 etc vim vimrc文件 在最后加上两句 完事ok 注 set nu 显示行号 set tabstop 4 设置缩进 set nonumber取消行号 set nu set tabstop 4 vim的高级
  • SpringBoot2为什么默认使用CGLib不再使用JDK动态代理

    SpringBoot2为什么默认使用CGLib不再使用JDK动态代理 CGLib和JDK动态代理对比 1 不需要实现接口 2 性能 3 代理对象的创建 4 调用方法 2 CGLib使用 CGLib和JDK动态代理对比 1 不需要实现接口 J
  • hadoop 配置history server 和timeline server

    一 配置history server 1 配置history server 在etc hadoop mapred site xml中配置以下内容 span style font size 18px span style font size
  • python工程师-Python工程师学习之旅

    1 Python软件开发基础 1 Linux操作系统2 Docker基础3 Python基础语法4 Python字符串解析5 Python正则表达式6 Python文件操作7 Python 模块8 Python异常9 python GUI编
  • 施密特触发器的作用-摘录+自解

    波形变换 可将三角波 正弦波 周期性波等变成矩形波 脉冲波的整形 数字系统中 矩形脉冲在传输中经常发生波形畸变 出现上升沿和下降沿不理想的情况 可用施密特触发器整形后 获得较理想的矩形脉冲 脉冲鉴幅 幅度不同 不规则的脉冲信号施加到施密特触
  • Opencv 视频帧的读写处理指导

    Opencv 视频帧的读写指导 思路指导 1 先打开视频文件 2 遍历视频帧 3 处理视频帧 4 保存所有的视频帧 1 打开视频 1 当读取的是保存的视频时 打开视频的方法为 cv VideoCapture capture 视频名 将视频放