ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

功能性模块: (5)图片生成视频:ffmpeg版和OpenCV版

2020-12-29 14:58:19  阅读:179  来源: 互联网

标签:功能性 ffmpeg img lists OpenCV video output path


功能性模块:(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 OpenCV
def GenVideoFromImg(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!")
    for img_list in tqdm(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 ffmpeg

2.2.2 代码实现

首先会看到一个ReName的函数,这个主要是为了整理一下图片的名称,以为ffmpeg对应图片帧是要对应图片名字是连续的,这个问题LZ找了好久,因为是跳帧进行测试的,所以图片名称是00001.jpg,00003.jpg。。。LZ生成了半天视频,发现始终只有一帧图像,倒腾了好久,才发现这个问题,哭晕。。还要自己给个权限,视频才能播放。

def ReName(img_path):
    """

    :param img_path: 视频序列的路径
    :return:
    """
    img_lists = os.listdir(img_path)
    img_lists.sort()
    count = 0
    for i in range(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)


def ConvertVideoH264(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日,最近全国各个地方都开始零零星星的出现新冠疫情,真的希望这场疫情能快点过去,脱下口罩,看遍祖国大好河山,加油!

标签:功能性,ffmpeg,img,lists,OpenCV,video,output,path
来源: https://blog.csdn.net/Felaim/article/details/111903891

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有