最近一个项目需要使用USB摄像头去采集视频并保存成文件,需要一个摄像头录制工具,要求其实很简单,就是能够将摄像头采集的图像加上一个时间戳的水印,实时保存到指定的文件中。同时为了防止文件过大,最好能够按时间自动进行分隔存储(比如每5分钟自动新建一个文件)。在网上找了很久都没有找到满意的,什么摄像头录像大师、专业录像工具、录屏大师、录像专家之类的,要么就是要收费的,要么就是那种非常专业的,参数设置一大堆,还英文版,看上去脑袋就大了。于是,作为一个程序猿,求人不如求己,干脆自己写一个。
说干就干,刚好我的ubuntu系统下已经安装了OpenCV的环境,利用OpenCV来写一个摄像头采集和图像保存的工具,那也就是分分钟的事情。
开始之前,如果你的电脑没有安装OpenCV,那么请出门左转,参考【Ubuntu14.04系统下安装OpenCV 4.0.0开发环境全过程】自行完成。
这里说明一下,上面的链接中安装的是OpenCV 4.0.0的版本,但是很多东西并不是最新的就是最好的,还是要看你的需求。4.0的版本启用了很多新的接口,网上的资料还不是很全,所以,这里我还是建议大家安装3.4左右的版本,既不会太旧,也比较大众化,遇到问题时网上资料一抓一大把。
好了,闲话少说,开始干活!
第一步,写代码;
第二步,写Makefile;
第三步,编译运行;
第四步,打完收工!
哈哈,是不是很简单?
不信?不信的话,给你一个完整的工程代码, 您老亲自去下载、编译、运行,看看是不是真的很简单?
【点击码云仓库下载】
可见,程序确实是真的很简单,步骤很少,相关的接口全部直接采用OpenCV的API实现,简单快速!
这里还要说明一下的是,程序中采用了双线程模式,主线程负责进行视频加水印+存储文件等操作,子线程则专门负责进行摄像头数据的读取。之所以采用双线程,是因为摄像头读取的过程是同步的,如果你设置摄像头的帧率为30帧,那么读取一帧的耗时基本上就是30ms多(当然也有可能不止30ms),如果你是在同一个线程里完成所有的事情,那么一轮操作下来的耗时肯定会比30ms长,而且还会随着摄像头的工作情况变化而大幅度波动,最终会导致你采集出来的视频实际帧率不稳定,出现播放时帧率过快或者过慢的问题,体现到观看的效果上就是出现快动作或者慢动作。我也花了一整天的时间才把这个问题给解决掉,并且在主线程中还加入了时间约束条件,以进一步控制实际录制的视频帧率的稳定效果。具体的流程和过程,大家可以在我的代码里看到,注释还是比较详细的,相信大家应该能看得懂!