博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OpenCV入门系列(7):读取摄像头,保存为视频文件
阅读量:6627 次
发布时间:2019-06-25

本文共 1879 字,大约阅读时间需要 6 分钟。

在前一篇中已经实现了读取摄像头并实时显示,本文将重要讲述如何把它保存为视频文件。

关键代码

CvVideoWriter* writer = cvCreateVideoWriter(filePath,CV_FOURCC('P','I','M','1'),24,cvGetSize(frame));cvWriteFrame(writer, frame);cvReleaseVideoWriter(&writer);

原理比较简单,第一行cvCreateVideoWriter可创建一个writer,在创建时,可指定文件路径、视频编码格式、帧率和大小等参数。第二行是向writer中写入一帧图片。当写了很多帧,结束时,再调用cvReleaseVideoWriter释放writer。

完整代码

#include "cv.h"#include "highgui.h"int main(int argc, char** argv) {    cvNamedWindow("win");    CvCapture* capture = cvCreateCameraCapture(0);    IplImage* frame = cvQueryFrame(capture);    char* writePath = "d:\\my.mpg";    CvVideoWriter* writer = cvCreateVideoWriter(        writePath,        CV_FOURCC('P','I','M','1'),        24,        cvGetSize(frame)    );    while(1) {        frame = cvQueryFrame(capture);        if(!frame) break;        cvWriteFrame(writer, frame);        cvShowImage("win", frame);        char c = cvWaitKey(1000/24);        if(c==27) break;    }    cvReleaseVideoWriter(&writer);    cvReleaseCapture(&capture);    cvDestroyWindow("win");    return 0;}

代码比较简单,无须解释即可看明白。下面讲几个需要注意的地方。

编码格式的选择

cvCreateVideoWriter函数中需要指定一个编码格式。在《学习OpenCV》的例子中,使用了CV_FOURCC('M','J','P','G')(即Motion JPEG)的格式。我本以为例子中推荐的编码方式,肯定是最通用的,没想到保存下来的视频文件怎么都播放不了。后来改成CV_FOURCC('P','I','M','1')(即MPEG-1)才能正常播放。关于它支持的编码格式还有很多,具体有哪些不记得了,因为我找不到那个网页了

使用-1作为编码格式

有资料说,在windows 32位系统上,可以使用-1作为编码格式,这样在程序运行时,会弹出一个对话框让人选择编码方式。但在我的win7 x64上,没有提示。(也有群友说他那里有提示)

关于帧率

在代码中有两个地方涉及帧率,一个是保存的视频文件需要指定帧率,一个是从摄像头读取画面时需要按一定的帧率。在我理解,如果这两个帧率相同,保存的视频文件中的画面速度应该和正常速度是一样的。于是我给视频文件设了24,给读取摄像头的代码设为每隔1000/24毫秒读取一次。然而结果让我很意外,因为不论我怎么调整,保存的视频文件的播放速度都非常快。

经过思考与测试,最终发现,原来我的摄像头每秒最多只能获取6帧图片。所以视频文件的帧率也必须小于等于6。

如何获取摄像头的帧率

据说可以使用:

double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

来取摄像头的帧率,但我试了取不到,值总为0。

有群友说需要在前面先取一帧,再去取帧率,我试了还不行。可能摄像头比较弱,或者windows自带的驱动比较弱,拿不到。

有一个笨办法,就是手动计算。在取一帧画面前后计时,算出其帧率。

转载于:https://www.cnblogs.com/9keyes/archive/2012/08/06/2625868.html

你可能感兴趣的文章
HTML语法大全
查看>>
terasort 算法随笔
查看>>
双向循环链表
查看>>
Django~学习计划
查看>>
Git操作指南(2) —— Git Gui for Windows的建库、克隆(clone)、上传(push)、下载(pull)、合并(转)...
查看>>
Codeforces Gym 100203I I WIN 最大流
查看>>
windows下超越dirx的opencv视频转化库
查看>>
一起采坑redis(4)redis 管理命令--redis 批量删除key脚本(待完善)
查看>>
Python SimpleHTTPServer
查看>>
OBIEE 简介
查看>>
CRF,没完全看懂
查看>>
TEA加密/解密算法
查看>>
C++ Primer Plus 笔记第十二章
查看>>
WebControl向XSLT传参
查看>>
网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...
查看>>
php实现 简单密码(代码颜色变化)
查看>>
splay树入门(带3个例题)
查看>>
php实现把二叉树打印成多行(谋而后动,写好算法思路,不然浪费超多时间而且还是错误代码,而且精力消耗会导致代码正确率下降以及低级错误)...
查看>>
回溯1--素数环
查看>>
20145328 《信息安全系统设计基础》期中总结
查看>>