2021/03/16
已更新,修复了一些bug,添加了一些更友好的控制台输出,程序现在会自动删除缓存图片。默认情况下关闭所有imshow()调试语句。
如果还有其他问题欢迎在黄老师答疑群讨论。本次更新感谢@正在学习的昱昱提供的反馈。
bin中的程序已经自带了所有需要的环境,可以直接运行,无需配置opencv和ffmpeg
本次更新提供了一个标准测试数据,供测试:
测试图片:下载地址
该图片经过编码后生成的视频:下载地址
手机拍摄的视频(刻意抖动,位移,旋转,改变透视以测试系统稳定度)(4k 60fps Redmi K20Pro):下载地址
简单的注意事项:
- 视频录制时应该保证完整的录制(从开始到结束),只录制一部分是无法解析的
- 视频录制时一定要小心,不要让鼠标/播放器的提示文字遮挡住二维码
- 在调试时,可以启用代码中的debug宏,这样在关键步骤时就会显示图片,方便debug
- 解码大文件时一定要开启Release模式
- 使用vcpkg能很方便的配置opencv的环境,无需自己设定,详见vcpkg官方文档
- 注意相对目录下一定要包含ffmpeg.exe,否则会报错
- 建议先测试自己显示器/手机传感器的残影现象。一般来说,假如显示屏刷新率/相机录制帧率是60fps,那么,建议二维码的刷新率一般应该小于20fps,建议设置为15fps。测试链接 你也可以去该网站自行测试
简单的介绍这个项目的工作流程:
- 程序将文件读取到内存中
- 通过自己设定的108*108的二维码编码(包含原始信息,二维码定位点,帧编号,校验码),将原始信息转换成自定义的编码格式
- 通过opencv,生成图片
- 通过ffmpeg,将生成的图片序列合成为视频
- 通过手机拍摄视频(也可直接使用原始视频)
- 利用ffmpeg,将视频解码为图片序列
- 利用opencv读取图片,重定位为原始二维码图片
- 解析二维码中的信息,利用校验码判断解析是否出错
- 根据得到的信息得到帧编号,判断是否出现跳帧和重帧
- 将每一帧得到的原始信息拼接在一起,生成完整的输出文件。
这是一个可见光信息传输软件,通过将文件编码为视频,利用录制视频的形式,在另外一个设备上对录制的视频解码,从而利用可见光传输信息。
这是厦门大学信息学院计算机网络的课程项目。
软件编码端和解码端合为一体。利用ffmpeg,将多帧图像合成为视频,并利用ffmpeg对录制的视频进行解码。项目使用opencv进行图像识别和图片编码解码。
软件设计上只能传输单文件,目前的传输速率达到0.146Mbps。
命令行参数
encoder: 源数据路径,输出视频路径(最好以.mp4为结尾),最长视频时长(单位ms),传输帧率(可省略,建议不超过15fps)
decoder: 源视频路径,输出数据路径(最好以.mp4为结尾)