Python Opencv-MJPG压缩?

2024-04-26 07:55:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在处理完一段视频后,我得到了一个大得多的文件。MJPG fourcc编解码器压缩是否正确,或者是否会发生这种情况?原始视频大小为2.51MB,结果视频文件大小为16.8MB。在这段代码中,没有经过处理的图像可供参考,它使用的是与以前相同的图像,但大小有所增加。在

这是我的密码。在

import os
import cv2

width=960
height=540
fps=25.0

#video=cv2.VideoWriter('ntest\\video.avi',-1,1,(width,height))
fourcc=cv2.VideoWriter_fourcc(*'MJPG')
video = cv2.VideoWriter('ntest\\output.avi',fourcc, fps, (width,height))

cap = cv2.VideoCapture('in.mp4')
count = 0

prename="ntest\\frame"
extension=".jpg"

while cap.isOpened():
    ret,frame = cap.read()
    #after processing, replace frame with processed image
    cv2.imshow('window-name',frame)
    name=prename+str(count)+extension
    cv2.imwrite(name, frame)
    a=cv2.imread(name)
    video.write(a)
    os.remove(name) #deletes image file, only keeps video
    count = count + 1
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break

cap.release()
cap.destroyAllWindows()
cv2.destroyAllWindows()
video.release()

Tags: name图像视频videocountmbwidthcv2
2条回答

如果输入mp4文件使用像h264这样的现代编解码器,那么mjpeg很可能会更大。Mjpeg只是每个帧的一系列jpeg图像,它不能利用图像中帧间相同的区域,也不能利用现代视频编解码器使用的任何预测编码

在MPEG编解码器的情况下,只有I帧(关键帧)具有(有点)完整的JPEG信息。在关键帧之间有B帧或P帧,它们都是与其他帧相比的差分信息。http://www.bretl.com/mpeghtml/pixtypes.HTM

框架的典型模式IBBPBBP...BBIBBPBBP...BBIBBPBB...。对于压缩良好的MPEG4/divx视频,通常要经过几秒钟,直到视频流中出现一个关键帧。所有其他帧都是差分的。你可以注意到,当录制有一些颜色失真开始超过观察区域时,当伪影突然消失时,就是视频流遇到I帧时,可以清除空间。在

这些完全是示例数据,基于MPEG2而不是MPEG4编码。MPEG4的压缩比这个还要大。在

http://www0.cs.ucl.ac.uk/teaching/GZ05/09-mpeg.pdf第11页:

| Type    | Size (KB) | Compression |
|    - |     - |      - |
| I-frame | 50        | 10:1        |
|    - |     - |      - |
| B-frame | 25        | 20:1        |
|    - |     - |      - |
| P-frame | 10        | 50:1        |
|    - |     - |      - |
| Avg.    | 18        | 29:1        |

这表明,在MPEG2视频的情况下,MJPEG大约大3倍。这意味着将一个约7.53mb的假设MJPEG视频压缩到2.51mbmpeg2视频。MPEG4可以轻松实现比MPEG2高2倍的压缩(这都取决于编解码器的设置),因此它可以将15-18MB的MJPEG压缩到2.51MB的MPEG4中。不要忘记压缩是有损的,所以有些信息会丢失。但在理想的情况下,人的眼睛和耳朵不能识别太多数据丢失的伪影(阻塞、振铃等)。在

相关问题 更多 >