4

私はpython 2.7.5_1とopencv 2.4.4_0がmacports経由でインストールされたmac os x 1.7.5を使用しています。最新の依存ポートがすべてあるようです。

私のコードでは、cv2.Videowriter()が正常に作成されて開かれ、6kb の .avi ファイルが生成されますが、videoFile.write(img0)そのファイルには何も書き込まれません。ビデオストリームがファイルに書き込まれない理由を本当に理解できません。洞察はありますか?

私のコードは次のとおりです。

import cv2
import cv

cv2.namedWindow("Original")

cap0 = cv2.VideoCapture(0) 

codec = cv.CV_FOURCC('D','I','V','X')
print codec

videoFile = cv2.VideoWriter();
videoFile.open('video.avi', codec, 25, (640, 480),1)

key = -1
while(key < 0):
    success0, img0 = cap0.read()

    cv2.imshow("Original", img0)

    videoFile.write(img0)

    key = cv2.waitKey(1)
cv2.destroyAllWindows()

これらのコーデックを試しましたが、どれも機能しませんでした: I420、AVC1、YUV1、PIM1、MJPG、MP42、MP4V、DIV3、DIVX、XVID、IUYV、FFV1、FLV1、U263、H264、ZLIB

ここで言及されているすべてのクイックタイムコーデックも調べました

ZLIB コーデックを使用すると、次のエラーが表示されます。

[zlib @ 0x7fb0d130a000] Specified pixel format yuv420p is invalid or not supported

H264 コーデックを使用すると、エラーが発生します。

[libx264 @ 0x7fe423869600] broken ffmpeg default settings detected
[libx264 @ 0x7fe423869600] use an encoding preset (e.g. -vpre medium)
[libx264 @ 0x7fe423869600] preset usage: -vpre <speed> -vpre <profile>
[libx264 @ 0x7fe423869600] speed presets are listed in x264 --help
[libx264 @ 0x7fe423869600] profile is optional; x264 defaults to high

上記のエラーの意味がわかりませんでした。ffmpeg を最新バージョン (1.2.2_0+gpl2) に再インストールしようとしましたが、スクリプトがまだ機能しません。他のすべてのコーデックではエラーは発生しませんでした。

上記のコーデックで .mpg と .mkv のファイル拡張子も試しました。コーデックがファイル拡張子に適していないというエラーが表示されることがありますが、エラーが表示されない場合は、ごくわずかなサイズの読み取り不能なビデオ ファイルが表示されるだけでした。

どんな助けでも大歓迎です。

ps:私の問題を解決しなかった次のSOの質問をすでに行っています:

4

3 に答える 3

5

The problem seems to have been with the image size in the function videoFile.open('video.avi', codec, 25, (640, 480),1)

So I updated my script to include

size = (int(cap0.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
        int(cap0.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))

And then accordingly changed videoFile.open to

videoFile.open('video.avi', codec, 25, size,1)

Then my script started working.

ファイル拡張子が .avi の IYUV、I420、PIM1、MJPG、FFV1、および DIVX の fourcc でコーデックを試しました。

上記の各コーデックは、フレーム レート 16、20、25、および 30 で動作しましたが、PIM1 は 20fps 以上でのみ動作するようです。

また、

  • fourcc THEO を使用したコーデックは、ファイル拡張子 .ogv で動作しました
  • XVID はファイル拡張子 .mkv で適切に動作し、.mkv コンテナーはどのエンコーディングでも動作するはずですが、他のコーデックではさまざまな奇妙な結果が得られました。
  • ファイル拡張子が .flv の FLV1 が機能しませんでした。エラーが発生しました:

    [flv @ 0x7f8414006000] Tag FLV1/0x31564c46 incompatible with output codec id '22' ([2][0][0][0])

  • ファイル拡張子が .flv の FLV4 ではエラーは発生しませんでしたが、opencv の videowrite では「ビデオ ファイルを更新できませんでした」というエラーが出力されました。

.avi ファイル コンテナーで動作するコーデックのうち、DIVX は最小のビデオ ファイル (4 秒のビデオで ~4Mb) を生成し、IYUV は最大のファイル (4 秒のビデオで ~160Mb) を生成しました。

ノート:

  • fps = videoCapture.get(cv2.cv.CV_CAP_PROP_FPS)ウェブカメラからキャプチャする場合、常に 0.0 を返します。これは、OpenCV2.4.3 および OpenCV2.4.4 のバグです。
  • また、Apple の設計者が Mac のカメラへの簡単なアクセスを禁止しているため、ffmpeg は Mac の iSight および FacetimeHD Web カメラから Windows や Ubuntu から取得できるように画像を取得できないこともわかりました。

参考文献:

http://en.wikipedia.org/wiki/Comparison_of_container_formats

于 2013-09-19T17:36:54.407 に答える
1

最初は 0kb のビデオ ファイルを取得していました。コーデックを MJPG から iYUV に変更しました。それは私のために働いた。Python 2.7 および openCV 2.4.5。

cap = cv2.VideoCapture(0)
fourCC = cv2.cv.CV_FOURCC('i','Y','U', 'V'); # Important to notice cv2.cv.CV_FOURCC
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),   int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter("Test.avi", fourCC, 15.0, size, True)
于 2014-03-21T11:17:48.003 に答える