Python Opencv MJPG压缩?

时间:2017-09-27 03:45:39

标签: python opencv

处理视频后我收到的文件要大得多。 MJPG fourcc编解码器是否正确压缩或者这应该发生?原始视频大小为2.51 mb,结果视频文件大小为16.8 mb。在此代码中,没有要引用的已处理图像,它使用与以前相同的图像,但尺寸增加。

这是我的代码。

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()

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

在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.53 MB假设的MJPEG视频压缩为2.51 MB MPEG2视频。 MPEG4可以轻松实现比MPEG2多2倍的压缩(全部取决于编解码器设置),因此它可以将15-18MB MJPEG压缩为2.51 MB MPEG4。永远不要忘记压缩是有损的,所以有些信息会丢失。但在理想的情况下,人眼和耳朵不会识别数据丢失(阻塞,振铃......)的过多伪影。