OpenCV将多幅BMP压缩成AVI文件

2023-10-27

最近需要同时采集多个摄像头的视频,一般的屏幕录制软件使用不了,只能自己把一幅幅图片保存下来,再转成AVI视频。

OpenCV正好提供了这类函数,所以自己做了一个简单的转换工具。主要利用的函数:

CvVideoWriter* cvCreateVideoWriter(const char* filename, int fourcc, double fps,CvSize frame_size, intis_color=1)

创建一个视频文件Writer

Parameters:
  • filename – Name of the output video file.
  • fourcc – 4-character code of codec used to compress the frames. For example,CV_FOURCC('P','I','M,'1') is a MPEG-1 codec,CV_FOURCC('M','J','P','G') is a motion-jpeg codec etc. Under Win32 it is possible to pass -1 in order to choose compression method and additional compression parameters from dialog. Under Win32 if 0 is passed while using an avi filename it will create a video writer that creates an uncompressed avi file.
  • fps – Framerate of the created video stream.
  • frame_size – Size of the video frames.
  • is_color – If it is not zero, the encoder will expect and encode color frames, otherwise it will work with grayscale frames (the flag is currently supported on Windows only).

encs[CV_FOURCC('H','F','Y','U')]=(char*)"ffenc_huffyuv";
encs[CV_FOURCC('D','R','A','C')]=(char*)"diracenc";
encs[CV_FOURCC('X','V','I','D')]=(char*)"xvidenc";
encs[CV_FOURCC('X','2','6','4')]=(char*)"x264enc";
encs[CV_FOURCC('M','P','1','V')]=(char*)"mpeg2enc";

CV_FOURCC('P', 'I', 'M', '1') = MPEG-1 codec

CV_FOURCC('M', 'J', 'P', 'G') = motion-jpeg codec
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec

CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec

CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec 
CV_FOURCC('U', '2', '6', '3') = H263 codec 
CV_FOURCC('I', '2', '6', '3') = H263I codec

CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

On Windows HighGui uses Video for Windows (VfW), on Linux ffmpeg is used and on Mac OS X the back end is QuickTime.

 

void cvReleaseVideoWriter(CvVideoWriter** writer)

释放Writer

 

int cvWriteFrame(CvVideoWriter* writer, constIplImage* image)

将读取的图像写入Writer


由于不知道自己电脑上安装的编码器在OpenCV中要如何用CV_FOURCC的宏表示,所以采用-1的方式选择一种编码方式,然后debug进入opencv源代码得到相应的编码器1935959654。不知道有没有什么方式可以直接获取这些对应的编码方式。

// VideoSaver.cpp

#include <stdio.h>

#include <cv.h>   
#include <cvaux.h>   
#include <highgui.h>   

#pragma comment(lib, "ml.lib")   
#pragma comment(lib, "cv.lib")   
#pragma comment(lib, "cvaux.lib")   
#pragma comment(lib, "cvcam.lib")   
#pragma comment(lib, "cxcore.lib")   
#pragma comment(lib, "cxts.lib")   
#pragma comment(lib, "highgui.lib")   
#pragma comment(lib, "cvhaartraining.lib") 

#define VIDEO_FRAME_WIDTH	320
#define VIDEO_FRAME_HEIGHT	240
#define VIDEO_FPS			20

int main()
{
	CvCapture *pLeftCapture = NULL;
	CvCapture *pRightCapture = NULL;

	int lImgWidth, lImgHeight;

	IplImage *pLeftCurImg = NULL;
	IplImage *pRightCurImg = NULL;

	CvVideoWriter *pLeftVideoWriter = NULL;
	CvVideoWriter *pRightVideoWriter = NULL;

	int lFrameIndex = 0;
	int wait_key, wt = 1;
	int lSaveVideo = 0;

	pLeftCapture = cvCreateCameraCapture(0);
	pRightCapture = cvCreateCameraCapture(1);

	if (pLeftCapture == NULL || pRightCapture == NULL)
	{
		printf("can not open camera!\n");
		return -1;
	}

	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FRAME_WIDTH, VIDEO_FRAME_WIDTH);
	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FRAME_HEIGHT, VIDEO_FRAME_HEIGHT);
	cvSetCaptureProperty(pLeftCapture, CV_CAP_PROP_FPS, VIDEO_FPS);

	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FRAME_WIDTH, VIDEO_FRAME_WIDTH);
	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FRAME_HEIGHT, VIDEO_FRAME_HEIGHT);
	cvSetCaptureProperty(pRightCapture, CV_CAP_PROP_FPS, VIDEO_FPS);

	cvNamedWindow("Left Camera");
	cvNamedWindow("Right Camera");
	cvMoveWindow("Left Camera", 0, 0);
	cvMoveWindow("Right Camera", VIDEO_FRAME_WIDTH+10, 0);


	lFrameIndex = 0;
	for (;;)
	{
		pLeftCurImg = cvQueryFrame(pLeftCapture);
		pRightCurImg = cvQueryFrame(pRightCapture);

		if (pLeftCurImg == NULL || pRightCurImg == NULL)
		{
			break;
		}

		lFrameIndex++;

		lImgWidth = pLeftCurImg->width;
		lImgHeight = pLeftCurImg->height;

		cvShowImage("Left Camera", pLeftCurImg);
		cvShowImage("Right Camera", pRightCurImg);

		if (lSaveVideo)
		{
			if (!pLeftVideoWriter)
			{
				pLeftVideoWriter = cvCreateVideoWriter("LeftCapture.avi", 
					1935959654,//-1,
					VIDEO_FPS, cvSize(lImgWidth, lImgHeight), 1);
			}

			if (!pRightVideoWriter)
			{
				pRightVideoWriter = cvCreateVideoWriter("RightCapture.avi", 
					1935959654,//-1,
					VIDEO_FPS, cvSize(lImgWidth, lImgHeight), 1);
			}

			cvWriteFrame(pLeftVideoWriter, pLeftCurImg);
			cvWriteFrame(pRightVideoWriter, pRightCurImg);
		}

		wait_key = cvWaitKey(wt);
		if (wait_key == 27) // ESC
			break;
		if (wait_key == 's')
		{
			lSaveVideo = 1;
		}
	}

	cvDestroyWindow("Left Camera");
	cvDestroyWindow("Right Camera");
	if (pLeftCapture) cvReleaseCapture(&pLeftCapture);
	pLeftCapture = NULL;
	if (pRightCapture) cvReleaseCapture(&pRightCapture);
	pRightCapture = NULL;

	if (pLeftVideoWriter) cvReleaseVideoWriter(&pLeftVideoWriter);
	pLeftVideoWriter = NULL;
	if (pRightVideoWriter) cvReleaseVideoWriter(&pRightVideoWriter);
	pRightVideoWriter = NULL;

	return 0;
}

 

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

OpenCV将多幅BMP压缩成AVI文件 的相关文章

  • 相机姿态估计(OpenCV PnP)

    我正在尝试使用网络摄像头从具有已知全球位置的四个基准点的图像中获取全局姿态估计 我检查了许多 stackexchange 问题和一些论文 但似乎无法得到正确的解决方案 我得到的位置数字是可重复的 但与相机移动绝不成线性比例 仅供参考 我正在
  • 如何提取图像中的表格

    我想从图像中提取表格 这个 python 模块https pypi org project ExtractTable https pypi org project ExtractTable 与他们的网站https www extractta
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • CvMat 和 Imread 与 IpImage 和 CvLoadImage

    使用 OpenCv 2 4 我有两个选项来加载图像 1 CvMat and Imread 2 IpImage and CvLoadImage 使用哪一个更好 我尝试将两者混合并最终出现段错误 imread返回一个Mat not CvMat
  • 如何在Python中使用tcp套接字发送和接收网络摄像头流?

    我正在尝试重新创建这个项目 https github com hamuchiwa AutoRCCar 我拥有的是服务器 我的电脑 和客户端 我的树莓派 我所做的与原始项目不同的是我尝试使用一个简单的网络摄像头而不是树莓派摄像头将图像从我的
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • OpenCV的拼接模块可以拼接平行运动相机拍摄的图像吗?

    我想知道是否缝合 http docs opencv org modules stitching doc stitching html http docs opencv org modules stitching doc stitching
  • 如何将输出视频保存到 OpenCV 中的文件中

    我想将输出视频保存到文件中而不是显示它并尝试使用 cvcaptureimage 但仍然无法获得结果 include
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 使用 OpenCV 改进特征点匹配

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

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

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何绘制更大的边界框和仅裁剪边界框文本 Python Opencv

    我正在使用 easyocr 来检测图像中的文本 该方法给出输出边界框 输入图像如下所示 Image 1 Image 2 使用下面的代码获得输出图像 But I want to draw a Single Bigger bounding bo
  • iOS 上的 OpenCV - VideoCapture 属性始终返回 1

    我一直在尝试构建一个简单的 OpenCV iOS 应用程序 该应用程序从捆绑包中加载视频并查询其帧数 持续时间等 然后它将尝试从中获取各个帧 不幸的是 当我使用VideoCapture类中 所有属性返回值 1 然后我尝试导航到frame 1
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • 如何使用 colorchecker 在 opencv 中进行颜色校准?

    我有数码相机获取的色彩检查器图像 我如何使用它来使用 opencv 校准图像 按照以下颜色检查器图像操作 您是想问如何进行颜色校准或如何使用 OpenCV 进行校准 为了进行颜色校准 您可以使用校准板的最后一行 灰色调 以下是您应该逐步进行

随机推荐

  • UVA-10976 分数拆分 题解答案代码 算法竞赛入门经典第二版

    GitHub jzplp aoapc UVA Answer 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 除了书上讲的y lt 2k之外 y gt k 否则等式不可能成立 include
  • Hibernate @OneToOne FetchType.LAZY不生效

    在Hibernate中 提供了懒加载功能 当需要的时候才查询具体数据 但是在使用 OneToOne关系时 FetchType LAZY看起来不会生效 当你查询一个实体类A 这个实体类A持有另一个实体类B的引用 但是A中并没有记录B的主键 这
  • 怎样正确安装超声波水位计?

    1 应保持仪表垂直安装 在安装超声波液位计时 要保证换能器的发射面和被测的平面平行 这样可以保证垂直发射到被测物体表面的声波以最大的能量返回 2 实际安装时 如果现场工况有蒸汽 易有水珠附着在探头表面 并且探头的量程比实际要测量的距离大很多
  • Python 调用 WebService

    最近做新项目用 Python 开发 作为初学者 遇到了不少问题 客户端的一个模块要调用公司网站的一些新闻 只好用 WebService 实现 WebService 搭建我就不说了 这里主要说在 Python 调用 WebService 的方
  • BGP-路由反射器、联邦实验(1.11)

    目标 1 首先需要基于该与拓扑图对172 16 0 0 16进行子网划分 题中一共需要八个网段的环回和一个骨干链路共8个网段 172 16 0 0 20 骨干 再分为八个 172 16 0 0 30 172 16 0 4 30 172 16
  • java去重复元素并打印_Java打印数组中重复元素

    Java打印数组中重复元素 1 说明 在此程序中 我们需要打印数组中存在的重复元素 这可以通过两个循环来完成 第一个循环将选择一个元素 第二个循环将通过将所选元素与其他元素进行比较来遍历整个数组 如果找到匹配项 则打印重复的元素 在上面的数
  • 仙道服务器维护,【正式服】2月14日例行更新维护公告

    为了给您提供更优质的游戏体验 诛仙手游 正式服 将于2月14日7 00 9 00进行例行维护 如遇特殊情况 开机时间将会顺延 本次更新后 等级 30级的玩家将通过邮件收到200绑定元宝更新补偿奖励 情人节特别活动 1 执子之手 与子同秀 活
  • 【面试】面试官:src和href的区别

    1 请求资源类型不同 1 href是Hypertext Reference的缩写 表示超文本引用 用来建立当前元素和文档之问的链接 常用的有 link a 2 在请求 src 资源时会将其指向的资源下载并应用到文档中 常用的有script
  • C++STL容器(上)string/vector/deque/stack/queue/list

    数据结构 研究节点和节点之间的关系 STL 算法 容器 迭代器 实现了数据结构和算法的有效分离 用来管理元素 算法和迭代器可以进行无缝连接 count v begin v end 3 统计元素3的个数 容器除了可以放基础数据类型 也可以放元
  • 字符数组、字符串数组转换成字符串【JAVA基础】

    一 字符数组to字符串 直接声明 char c a b c String s new String c 二 字符串数组to字符串 string是不可变类 利用StringBuffer String str abc dfe hij Strin
  • l130 华大低功耗mcu_HC32L110C6PA HC32L110C6UA 华大超低功耗 Cortex-M0+ 32位MCU

    HC32L110C6PA HC32L110C4UAHC32L110C6UA 华大超低功耗 Cortex M0 32位MCU HC32L110C6PA HC32L110C4UA 华大超低功耗 Cortex M0 32位MCU 超低功耗 MCU
  • BLE基础理论/Android BLE开发示例/蓝牙扫描列表数量扫描包/扫描响应包设置等

    参考 https blog csdn net qq 36075612 article details 127739150 spm 1001 2014 3001 5502 参考 https blog csdn net qq 36075612
  • 蓝桥杯:李白打酒加强版

    话说大诗人李白 一生好饮 幸好他从不开车 一天 他提着酒壶 从家里出来 酒壶中有酒 22 斗 他边走边唱 无事街上走 提壶去打酒 逢店加一倍 遇花喝一斗 这一路上 他一共遇到店 NN 次 遇到花 MM 次 已知最后一次遇到的是花 他正好把酒
  • Java变量的分类(根据作用域)

    按照作用域的不同 变量可分为 成员变量和局部变量 成员变量有两种 静态变量和实例变量 成员变量 在类中声明 作用域是整个类 局部变量 在一个方法的内部声明 作用域是整个方法 静态变量 被static关键字修饰 在内存中只有一个 被类的所有实
  • Jenkins配置定时任务

    1 点击任务后 点击配置 2 选择 构建触发器 下面的 定时构建 并设定定时规则 设置完成后 构建任务就会按照我们设置的时间定时执行了 3 设定规则 此处定时任务的格式遵循 cron 的语法 可以与 cron 的语法有轻微的差异 具体格式
  • App版本更新接口的设计

    工作这几年碰到的版本检测升级的接口也算是五花八门 啥样的都有 但肯定有的功能是有个apk的下载链接 能间接或直接提示你是强制还是非强制更新 间接是指提供你后台最新版本号 让你自己与本地版本号通过比较得出是否升级 直接就是后台接口直接返回个B
  • redhat6.9安装docker

    1 离线安装说明 内网环境需要在redhat6 9上安装docker以及docker compose 内网不能连接互联网 所以只能采用手工下载离线安装包的方式做 2 需要操作系统版本 docker支持的版本有 redhat7 redhat6
  • java类的加载顺序

    一 程序 package yy class Parent static int a 4 static System out println Parent class Chlid extends Parent static int a 5 s
  • tensorflow笔记(二十七)——重要tensor操作函数

    1 合并 多个tensor的合并主要包括2个函数 tf concat和tf stack 他们的输出参数都是list of tensor 区别是 tf concat是沿某一维度拼接shape相同的张量 拼接生成的新张量维度不会增加 tf st
  • OpenCV将多幅BMP压缩成AVI文件

    最近需要同时采集多个摄像头的视频 一般的屏幕录制软件使用不了 只能自己把一幅幅图片保存下来 再转成AVI视频 OpenCV正好提供了这类函数 所以自己做了一个简单的转换工具 主要利用的函数 CvVideoWriter cvCreateVid