用OpenCV将视频分解成单帧图片,图片合成视频示例
作者:虚心学习进步 发布时间:2023-04-25 22:55:03
标签:OpenCV,单帧图片,合成视频
本文做的是基于opencv将视频帧转成图片输出,由于一个视频包含的帧数过多,经常我们并不是需要它的全部帧转成图片,因此我们希望可以设置每隔多少帧再转一次图片(本文设置为30帧),若有人需求是只需要前多少帧,也可以类似的改写下代码即可。
程序一:
#include <iostream>
#include "cv.h"
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
// 描述:将视频帧转成图片输出
void main()
{
// 获取视频文件
VideoCapture cap("J:\\CQH\\DLFR\\lab_face\\video\\DSC_0023.MOV");
// 获取视频总帧数
long totalFrameNumber = cap.get(CV_CAP_PROP_FRAME_COUNT);
cout << "total frames: " << totalFrameNumber << endl;
Mat frame;
bool flags = true;
long currentFrame = 0;
while (flags){
// 读取视频每一帧
cap.read(frame);
stringstream str;
str << "cqh" << currentFrame << ".jpg";
cout << "正在处理第" << currentFrame << "帧" << endl;
printf("\n");
// 设置每30帧获取一次帧
if (currentFrame % 30 == 0){
// 将帧转成图片输出
imwrite("J:\\CQH\\DLFR\\lab_face\\videoToImages\\DSC_0023\\" + str.str(), frame);
}
// 结束条件
if (currentFrame >= totalFrameNumber){
flags = false;
}
currentFrame++;
}
system("pause");
}
程序2(批量有序读取图片)
#include<opencv2/opencv.hpp>
using namespace cv;
void main()
{
//批量读取图片(有序)
char filename[50];
char winName[50];
Mat srcImg;
for (int i = 1; i < 100; i++)
{
sprintf(filename,"%d.bmp",i);
sprintf(winName,"NO--%d",i);
srcImg=imread(filename);
if (srcImg.empty())
break;
imshow(winName,srcImg);
}
waitKey(0);
destroyAllWindows();
}
二、视频分解成图片
需要提前在E盘创建pic文件夹,图片命名由1,2....这样的编号排好
#include<opencv2/opencv.hpp>
using namespace cv;
void main()
{
Mat frame;
char outfile[50];
VideoCapture cap("E:\\2.avi");
if (!cap.isOpened())//打开失败
return;
int totalFrame=cap.get(CV_CAP_PROP_FRAME_COUNT);//获取视频总帧数
for (int i = 1; i <=totalFrame; i++)
{
cap>>frame;
if (frame.empty())
break;
sprintf(outfile,"E:\\pic\\%d.bmp",i);
imwrite(outfile,frame);
imshow("video",frame);
waitKey(15);
}
cap.release();
destroyAllWindows();
}
三、图片合成视频
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void main()
{
VideoWriter writer("E:\\out.avi",CV_FOURCC('X','V','I','D'),20,Size(320,240),true);//Size要和图片尺寸保持一致
char filename[50];
Mat frame;
for (int i = 1; i < 644; i++)
{
sprintf(filename,"E:\\pic\\%d.bmp",i);
frame=imread(filename);
if(frame.empty()) break;
writer<<frame;
}
cout<<"write end!"<<endl;
destroyAllWindows();
}
结果在E盘根目录生成一个out.avi的视频文件,这个目录可以自己改,图片源路径也可以自己改
来源:https://blog.csdn.net/qq_34793133/article/details/83929612


猜你喜欢
- var chars = ['0','1','2','3','4
- 一、功能这里的需求是,判断摄像头有没有被物体遮挡。这里只考虑用手遮挡---->判断黑色颜色的范围。二、使用OpenCV的Mat格式图片
- 茎叶图from itertools import groupbynums2=[225, 232,232,245,235,245,270,22
- 搭建vue的开发环境:1、必须要安装nodejs2、搭建vue的开发环境 ,安装vue的脚手架工具 官方命令行工具npm install -
- 表单在网页中主要负责数据采集功能。一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程序的URL以及数
- 介绍本篇将介绍Python3中的迭代器与生成器,描述可迭代与迭代器关系,并实现自定义类的迭代器模式。迭代的概念上一次输出的结果为下一次输入的
- 前言:终于来了一篇有质量的文章,我个人感觉非常不错,《jfinal与bootstrap之间的登录跳转实战》。具体内容包含有点击登录弹出模态框
- 我们在flask的学习中,会难免遇到多对多表的查询,今天我也遇到了这个问题。那么我想了好久。也没有想到一个解决的办法,试了几种方法,可能是思
- MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了
- 前言:创建进程池可以形象地理解为创建一个并行的流水线,只需创建一次流水线的消耗,处理接收到的任务的,不使用进程池。 ,浪费时间。中方本来没有
- 〝 古人学问遗无力,少壮功夫老始成 〞python之tkinter库弹窗messagebox,常码字不易,出精品更难,没有特别幸运,那么请先
- 字符串(sting)是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符。
- 本文重点系统分析网页性质结构化的数据解析csv数据保存环境介绍python 3.8pycharm 专业版 >>> 激活码#
- 方法1:使用Python中自带的print输出带有颜色或者背景的字符串书写语法print(\033[显示方式;前景色;背景色m输出内容\03
- 有些小伙伴跟小编讨论了python中使用多线程原理的问题,就聊到了关于python多线程的弊端问题,这点可能在使用的过程中大家会能感觉到。而
- 本文实例为大家分享了php微信公众号开发之快递查询的具体代码,供大家参考,具体内容如下快递查询数组用法foreach查询接口是:爱快递:ht
- background-clip 和 background-origin 是 CSS3 中新加的 background module 属性,用
- 对python网页请求模块urllib2进行简单的封装。例子:#!/usr/bin/python#coding: utf-8import b
- 本文主要研究的是用Python语言建立Map写Excel表的相关代码,具体如下。前言:我们已经能够很熟练的写Excel表相关的脚本了。大致的
- scrollWidth 是对象的实际内容的宽,不包边线宽度,会随对象中内容的多少改变(内容多了可能会改变对象的实际宽度)。 cl