OpenCV+VS 读取、采集视频、切割为序列图像

2023-05-16

  • VideoCapture读取视频

cv::VideoCapture capture(const string& filename); // 输入文件名
cv::VideoCapture capture(0); // 视频捕捉设备

 将视频帧读取到cv::Mat矩阵中,有两种方式:一种是read()操作;另一种是 “>>”操作。

cv::Mat frame;
cap.read(frame); //读取方式一
cap >> frame; //读取方式二

调用摄像头采集图像

#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
	//从摄像头读入图像
	VideoCapture capture(0);
	while (1)//循环显示每一帧
	{
		Mat frame;//Mat变量存储每一帧图像
		capture >> frame;//读取当前帧
		imshow("读取视频", frame);//显示当前帧
		waitKey(30);//延时30秒
	}
	return 0;
}

注:需要打开某个现成视频图像时,将0替换为"./xxx.avi"即可。

实时处理视频

其实就是对每一帧进行处理,frame作为图像,进行处理即可。


  •  VideoWriter 视频的写操作

cv::VideoWriter out(  
    "my_video.avi", //视频文件名和路径
    CV_FOURCC('M','J','P','G'), // MPEG-4 编码  
    30.0, // 帧率 (FPS)  
    cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480  
    true // 只输入彩色图,如果是false,可传入灰度图像     
);  

向创建后的VideoWriter对象写入图像也有两种方式,即write()操作和“<<”操作

	out.write(const Mat& image); // 写入图像作为下一帧
	
	my_video_writer << my_frame;

调用相机生成视频并保存

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

using namespace std;
using namespace cv;

int main(){
	//打开相机
	VideoCapture vcap(0);
	if (!vcap.isOpened()){
		cout << "Error opening video stream or file" << endl;
		return -1;
	}
	int frame_width = vcap.get(CV_CAP_PROP_FRAME_WIDTH);
	int frame_height = vcap.get(CV_CAP_PROP_FRAME_HEIGHT);
	//保存视频
	VideoWriter video("out.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, Size(frame_width, frame_height), true);
	//需要for循环可以Ctrl+C终端录制
	for (;;){
		Mat frame;
		vcap >> frame;
		video.write(frame);
		imshow("Frame", frame);
		char c = (char)waitKey(33);
		if (c == 27) break;
	}
	return 0;
}

切割视频为图像序列


#include <iostream>  
#include <vector>  
#include "opencv2\highgui\highgui.hpp"  

using namespace std;
using namespace cv;

void video2image(string video, string path)
{
	VideoCapture capture(video);
	long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);
	cout << "total frames is:" << totalFrameNumber << "." << endl;
	//设置开始帧  
	long frameToStart = 1;
	capture.set(CV_CAP_PROP_POS_FRAMES, frameToStart);
	cout << "from" << frameToStart << "read" << endl;
	//设置结束帧  
	int frameToStop = 10;

	//获取帧率  
	double rate = capture.get(CV_CAP_PROP_FPS);
	cout << "rate is:" << rate << endl;
	double delay = 1000 / rate;
	//定义一个用来控制读取视频循环结束的变量  
	bool stop = false;
	long currentFrame = frameToStart;

	if (!capture.isOpened())
	{
		cerr << "Failed to open a video" << endl;
		return;
	}

	Mat frame;
	int num = 1;
	string filename;
	char   temp_file[15];

	while (!stop)
	{
		capture >> frame;
		if (frame.empty())
			break;
		_itoa_s(num, temp_file, 4, 10); //4表示字符长度,10表示十进制,_itoa_s实现整型转字符串  
		filename = temp_file;
		filename = path + filename + ".jpg";

		cout << "now is reading" << currentFrame << "." << endl;
		imshow("Extractedframe", frame);

		cout << "now is writing" << currentFrame << "." << endl;
		imwrite(filename, frame);

		int c = waitKey(delay);
		//按下ESC或者到达指定的结束帧后退出读取视频  
		if ((char)c == 27 || currentFrame > frameToStop)
		{
			stop = true;
		}
		//按下按键后会停留在当前帧,等待下一次按键  
		if (c >= 0)
		{
			waitKey(0);
		}

		num++;
		currentFrame++;
	}
	capture.release();
	waitKey(0);
}

int main(int argc, char** argv)
{
	string videoFromfile = ".\\out.avi";  //读取视频  
	string Imagespath = ".\\image\\";    // 保存图片的文件夹路径一定要有,因为OpenCV不会自动创建文件夹  
	video2image(videoFromfile, Imagespath);
	return 0;
}

 

接下考虑实际使用时应该是调用摄像头直接生成图像序列,并不是先生成视频再切割为图像序列的。

下面的代码是自己修改的,只能产生了视频,并没有同时产生图像序列,有待完善


#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

int main()
{
	/*------------------采集保存视频avi--------------------*/
	//开启电脑摄像头
	VideoCapture cap(0);
	if (!cap.isOpened()){
		cout << "Error opening video stream or file" << endl;
		return -1;
	}

	int frame_width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
	int frame_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
	//保存视频格式为avi, 编码为MJPG
	VideoWriter video("image1.avi", CV_FOURCC('M', 'J', 'P', 'G'), 30, Size(frame_width, frame_height), true);
	//需要for循环可以Ctrl+C终止录制
	for (;;){
		Mat frame;
		cap >> frame;
		video << frame;
		imshow("Frame", frame);
		waitKey(30);
	}
	/*------------------裁剪为图像序列--------------------*/
	//读取视频
    VideoCapture cap0("image1.avi");
	if (!cap0.isOpened())
		cout << "no video" << endl;

	Mat frame0;
	int num = 1;
	string filename;
	char temp_file[15];
	string path = ".\\image1";

	for (int i = 1;; i++)
	{
		cap0 >> frame0;
		if (frame0.empty())
			break;
			_itoa_s(num, temp_file, 4, 10);//整型转字符串
			filename = temp_file;
			filename = path + filename + ".jpg";
			num++;
			imwrite(filename, frame0);
	}
	cap0.release();
	return 0;
}


 

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

OpenCV+VS 读取、采集视频、切割为序列图像 的相关文章

随机推荐

  • STM32常用功能配置

    STM32基本代码 设置外部中断定时器中断定时器产生pwmAD多通道转换DMA 43 AD扫描多通道转换iic协议读取数据SPI协议读取数据 设置外部中断 中断优先级分组 外部中断 AFIO作用 注意 xff1a 1 相同的Pin不能同时触
  • Ogre-渐变背景色(gradient background)的实现

    转载自 xff1a http blog csdn net hefee article details 6287341 背景色在ogre里面是通过ViewPort类中的setBackgroundColour xff08 xff09 这个成员函
  • Qt::WindowFlags

    查了些资料 xff0c 整理了一下 xff0c 以备查询 枚举类型 Qt WindowFlags低位的一个字节用于定义窗口部件的窗口类型 Qt WindowFlags的高位字节定义了窗口提示 xff0c 窗口提示能够进行位或操作 xff0c
  • java学习记录8

    什么是File 文件夹和文件 xff1a 文件夹是用来组织和管理磁盘文件的一种数据结构 文件是在电脑中 xff0c 以实现某种功能或某个软件的部分功能为目的定义的一个单位 xff0c 文件是由文件名和图标组成 xff0c 一种类型的文件具有
  • 保护模式编程之(一)——分段机制与GDT/LDT

    概述 xff1a 若想理解操作系统程序中的启动相关的部分 xff0c 必须要理解保护模式下的编程 xff0c 而分段机制是保护模式编程下的基础 另外 xff0c 由于实模式与保护模式的不同 xff0c 对保护模式下的分段机制更需要注意 同时
  • C++ 网络编程

    socket通信 xff1a socket 创建TCP套接字 bind 将套接字绑定到本地地址端口上 listen 监听端口 connect accept 接受用户请求 xff0c 返回对应此连接的新套接字 read write close
  • ROS学习(2)——rviz与gazebo问题记录

    ROS学习 xff08 2 xff09 rviz与gazebo问题记录 继续按照教程学习 xff0c 踩了很多坑 1 工作环境配置问题 实践6 2 4在rviz中显示模型时 xff0c 运行launch文件出现如下报错 原因 xff1a 出
  • VINS-Mono 代码详细解读——基础储备:在线Cam到IMU的外参标定 InitialEXRotation类

    本讲还是为了estimator类中最主要的函数processImage xff08 xff09 做知识储备 前面两讲知识储备主要讲了IMU预积分相关的integrationBase类以及图像特征点管理器feature manager cpp
  • VINS-Mono 代码详细解读——回环检测与重定位、四自由度位姿图优化

    本文主要介绍VINS的闭环检测重定位与位姿图优化部分 xff0c 作为系列文章的最后一节 回环检测的关键就是如何有效检测出相机曾经经过同一个地方 xff0c 这样可以避免较大的累积误差 xff0c 使得当前帧和之前的某一帧迅速建立约束 xf
  • VS Code创建、调试ROS项目

    前言 xff1a 在vs code下配置ROS项目开发的环境 包括catkin创建编译工作空间 xff0c 创建ROS项目 xff0c 调试ROS节点 一 创建工作空间 首先创建一个cMake工作空间 xff0c 用到了catkin mak
  • 《wiki官网教程》2 编写简单的服务器service和客户端 client(C++)

    服务 xff08 services xff09 是节点之间通讯的另一种方式 服务允许节点发送请求 xff08 request xff09 并获得一个响应 xff08 response xff09 之前讲的是两个节点如果要通信需要经过话题to
  • 进程和线程主要区别与定义

    抽象理解 直接上图 xff0c CPU是工厂 电力资源是cpu 时间片 进程是车间 线程是车间工人 操作系统的资源分配与调度逻辑 以多进程形式 xff0c 允许多个任务同时运行 xff1b 以多线程形式 xff0c 允许单个任务分成不同的部
  • Ogre场景中管道透明之后为黑色的问题

    depth write 设置此渲染通路的深度缓冲写入的状态是打开状态还是关闭状态 格式 depth write lt on off gt 如果深度缓冲写入处于打开状态 xff0c 无论何时一个像素想要写入画面缓冲 xff0c 深度缓冲都会更
  • 移动机器人定位方法概述

    引言 自主移动机器人导航过程需要回答三个问题 xff1a 我在哪里 xff1f 我要去哪儿 xff1f 和 我怎样到达那里 xff1f 定位就是要回答第一个问题 xff0c 确切的 xff0c 移动机器人定位就是确定机器人在其运动环境中的世
  • 运动图像目标检测与跟踪简述

    运动图像跟踪问题分为目标检测与目标跟踪两部分 一 目标检测 目标检测即为从序列图像中将变化区域从背景图像中提取出来 xff0c 依照目标与相机之间的关系可以分为静态背景下运动检测与动态背景下运动检测 1 静态背景 指的是相机在监视过程中不发
  • 遗传算法 差分进化算法 粒子群优化算法区别

    一 遗传算法 遗传算法 GA 作为一种经典的进化算法 xff0c 自 Holland提出之后在国际上已经形成了一个比较活跃的研究领域 人们对 GA 进行了大量的研究 xff0c 提出了各种改进算法用于提高算法的收敛速度和精确性 遗传算法采用
  • 相似、仿射、射影变换区别

    刚性变换 xff1a 只有物体的位置 平移变换 和朝向 旋转变换 发生改变 xff0c 而形状不变 xff0c 得到的变换称为刚性变换 下面分别从等距变换 xff0c 相似变换 xff0c 仿射变换 xff0c 射影变换几个部分分别介绍 x
  • 《视觉SLAM十四讲精品总结》6.1:VO—— 2D-2D对极约束求位姿R、t

    本节内容已在笔记本进行推导分为2D 2D 3D 2D 3D 3D 三位场景中的同一个三维点在不同视角下的像点存在着一种约束关系 xff1a 对极约束 xff0c 基础矩阵E是这种约束关系的代数表示 xff0c 并且这种约束关系独立与场景的结
  • 数模4 单目标优化、多目标优化

    1 优化问题三要素 xff1a 决策变量 目标函数 约束 2 单 多目标优化的关系 xff1a 多目标优化问题的各个子目标之间是矛盾的 一个子目标的改善有可能会引起另一个或者另几个子目标的性能降低 也就是要同时使多个子目标一起达到最优值是不
  • OpenCV+VS 读取、采集视频、切割为序列图像

    VideoCapture读取视频 cv VideoCapture capture const string amp filename 输入文件名 cv VideoCapture capture 0 视频捕捉设备 将视频帧读取到cv Mat矩