2017-09-27 36 views
0

ビデオを処理した後にファイルがかなり大きくなりました。 MJPGの4ccコーデックは適切に圧縮されていますか、これが起こるはずですか?元のビデオサイズは2.51メガバイト、結果ビデオファイルのサイズは16.8メガバイトです。このコードでは、参照する処理済み画像はありません。以前と同じ画像を使用していますが、サイズが大きくなります。Python Opencv MJPG圧縮ですか?

ここに私のコードです。

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

入力mp4ファイルがh264のような最新のコーデックを使用すると、mjpegが大きくなる可能性が非常に高いです。 Mjpegは、各フレームの一連のjpeg画像であり、フレーム間で同じ画像の領域、または現代のビデオコーデックが使用する予測符号化を利用することはできません。

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  | 

これは、MJPEGは、MPEG2ビデオの場合の約3倍であることを示しています。これは、〜7.53 MBの仮想MJPEGビデオを2.51 MB MPEG2ビデオに圧縮することを意味します。 MPEG4はMPEG2よりも2倍の圧縮を容易に実現できます(すべてコーデックの設定に依存します)ので、15-18MBのMJPEGを2.51MBのMPEG4に圧縮できます。圧縮がロッシーであることを忘れないでください。そのため、一部の情報が失われます。しかし理想的なケースでは、人間の目と耳は、データの損失(ブロッキング、リンギング、...)のアーチファクトをあまり認識しません。