功能性模块:(5)图片生成视频:ffmpeg版和OpenCV版
一、模块介绍
这个模块其实是非常常用、基本的模块了,主要就是针对一些需要依靠视频才能评判效果的一些应用,当然小伙伴们按自己的需求来吧。
这个图片呢其实是LZ事先处理好的,这个里有一个小技巧可以分享给小伙伴们,在图像命名的时候尽量以00001.jpg,00002.jpg这种方式来命名,这样对图像进行排序的时候也会更加方便,不至于出现1.jpg,10.jpg,2.jpg…这种情况,会非常麻烦。
二、代码实现
2.1 OpenCV版本
OpenCV的安装LZ已经前前后后安装好几十次了,包括c++版本,cuda版本,python版本都安装了好多次了,这个就不再赘述了。
OpenCV有一个比较好的是即使你的图像命名是不连续的,也都可以写入到视频中去,LZ觉得还是比较方便的。
# generate video using OpenCVdefGenVideoFromImg(frame_root,output_video_path):''' :param frame_root: 存放图片打路径,这里可以根据需要自己修改 :param output_video_path: 输出视频的名称, :return: '''img_lists=glob.glob(frame_root+"/*.jpg")print("Image path is: ",frame_root)print("The length of img_lists: ",len(img_lists))img_lists.sort()img_test=cv2.imread(img_lists[0])h,w,c=img_test.shape fourcc=cv2.VideoWriter_fourcc('X','V','I','D')# 为了仔细看效果,帧率调的很小video_writer=cv2.VideoWriter(output_video_path,fourcc,10,(w,h))print("Begin to generate video!")forimg_listintqdm(img_lists):img=cv2.imread(img_list)video_writer.write(img)video_writer.release()2.2 ffmpeg版
ffmpeg版本其实LZ并没有很会使用,但是为什么要使用呢?是因为目前LZ公司的数据(包括测试数据)是没有办法下载到本地的,并且训练的模型也没法下载到本地,这样就需要在云平台上进行测试,但是云平台的播放只支持h264的播放,所以LZ只能找对应的方法了。
2.2.1 安装对应包
ffmpeg command not found出现这个问题其实就是没有对应依赖包,安装一下就行了,因为就是为了生成对应的视频,所以对于版本没有什么很高的要求
sudo apt install ffmpeg #或者 sudo apt-get install ffmpeg2.2.2 代码实现
首先会看到一个ReName的函数,这个主要是为了整理一下图片的名称,以为ffmpeg对应图片帧是要对应图片名字是连续的,这个问题LZ找了好久,因为是跳帧进行测试的,所以图片名称是00001.jpg,00003.jpg。。。LZ生成了半天视频,发现始终只有一帧图像,倒腾了好久,才发现这个问题,哭晕。。还要自己给个权限,视频才能播放。
defReName(img_path):""" :param img_path: 视频序列的路径 :return: """img_lists=os.listdir(img_path)img_lists.sort()count=0foriinrange(0,len(img_lists)):idx=int(img_lists[i].split('.')[0])os.rename(os.path.join(img_path,img_lists[i]),os.path.join(img_path,str(("%05d"%count))+'.'+'jpg'))count=count+1# print(img_lists)defConvertVideoH264(video_root,output_dir,seq):''' :param video_root: 视频保存的总的路径 :param output_dir: 保存图片的总的路径 :param seq: 视频名称,不含后缀名 :return: '''ReName("{}/frame/".format(output_dir))output_video_path=osp.join(output_dir,'{}.mp4'.format(seq))output_video_path_h264=osp.join(video_root,'{}-h264.mp4'.format(seq))cmd_str='ffmpeg -r 10 -f image2 -i {}/frame/%05d.jpg -c:v copy {}'.format(output_dir,output_video_path)os.system(cmd_str)cmd_convert='ffmpeg -i {} -vcodec h264 {}'.format(output_video_path,output_video_path_h264)os.system(cmd_convert)os.chmod(output_dir,0o755)2020年12月29日,最近全国各个地方都开始零零星星的出现新冠疫情,真的希望这场疫情能快点过去,脱下口罩,看遍祖国大好河山,加油!