zoukankan      html  css  js  c++  java
  • 利用python-opencv生成视频帧数控制,和常见错误总结

    首先呢 利用opencv生成视频的例子相信网络上已经很多了。但是大多数例子都只是捕获一个摄像头就没了。但是在实际运用中会发现。因为涉及到图像处理,生成的视频要不就就是过快要不就是比实际时间长。

    控制视频的帧数,捕获摄像头和生成图像都适用

    关键在于在生成一帧的时候与下一帧的间隔时间。中间图像处理会造成延迟所以说会造成视频时间比预想的长

     #计算处理时间
        sleeptime = time.time() - now
        #计算每一帧要延迟的时间
        sleeptime = 1 / fps - sleeptime
    
    import time
    import datetime
    import cv2
    
    #生成一个视频
    fps = 30.0  # 视频帧率
    size = (289, 419)
    baseimgpath = "/root/1.jpg"
    save_path = "/root/"
    flag = True
    fourcc = cv2.VideoWriter_fourcc(*'X264')
    file = save_path + datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + ".mp4"
    videoWriter = cv2.VideoWriter(file, fourcc, fps, size)
    while flag:
        now = time.time()
        baseimg = cv2.imread(baseimgpath)
        #这里的数据通过缓存服务器获取
        ret = mc.get('info')
        rpm = str(ret["carstate"]["RPM"]) + "r/min"
        speed = str(ret["carstate"]["SPEED"]) + "km/h"
        COOLANT_TEMP = str(ret["carstate"]["COOLANT_TEMP"])
        fuel = str(ret["carstate"]["FUEL"])
        ENGINE_LOAD = str(round(ret["carstate"]["ENGINE_LOAD"], 1)) + "%"
        v = str(12.2) + "V"
        cv2.putText(baseimg, rpm, (130, 73), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 2, cv2.LINE_AA)
        cv2.putText(baseimg, COOLANT_TEMP, (50, 150), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
        cv2.putText(baseimg, fuel, (180, 150), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
        cv2.putText(baseimg, ENGINE_LOAD, (50, 270), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
        cv2.putText(baseimg, v, (180, 270), cv2.FONT_HERSHEY_PLAIN, 1.8, (0, 0, 0), 1, cv2.LINE_AA)
        videoWriter.write(baseimg)
    
        #计算处理时间
        sleeptime = time.time() - now
        #计算每一帧要延迟的时间
        sleeptime = 1 / fps - sleeptime
        #暂停时间
        if sleeptime > 0:
            time.sleep(sleeptime)
        # time.sleep(1 / fps)
    videoWriter.release()
    cv2.destroyAllWindows()
    

    利用队列多进程处理

    对于多视频处理这个大佬讲的已经很详细了

    https://zhuanlan.zhihu.com/p/38136322

    常见问题

    生成的视频特别小

    这种一般是编码器没有选择对造成的,看看你电脑支不支持该编码,还有一种情况是摄像头问题比如。只支持30fps的摄像头要输出60fps的视频或者输出摄像头没有的分辨率

    #可以这样获取
    cap = cv2.VideoCapture(1) 
    fps = cap.get(cv2.CAP_PROP_FPS)
    w = int(cap.get(3))
    h = int(cap.get(4))
    

    生成的视频过快或过慢

    这个和处理能力有关。但凡造成延迟的操作就会造成这样的结果。所以说尽量控制帧数。用cpu占用少的编码器,降低视频分辨率等等。

  • 相关阅读:
    debug: if (va=1) 和 if (va==1)的区别
    必定管用!关于如何在电脑上恢复itunes中的音乐库(Mac Windows统统适用)
    关于Matlab中自动生成的asv文件
    LaTeX表格字体大小控制
    ANSYS中应力强度因子与J积分的计算
    Notepad++取消输入单词时出现提示
    notepad++的apdl高亮xml文件
    Power Graphics
    19个必须知道的Visual Studio快捷键
    APDL命令流:将ansys分析结果输出为tecplot格式
  • 原文地址:https://www.cnblogs.com/lzxcloud/p/13380752.html
Copyright © 2011-2022 走看看