そうです、OpenCVのデフォルトのピクセルフォーマットはBGRです。
ffmpeg側の同等のフォーマットはBGR24であるため、必要がない場合はYUV420pに変換する必要はありません。
この投稿では、Pythonアプリケーションを使用してWebカメラからフレームをキャプチャし、フレームをstdoutに書き込む方法を示します。目的は、cmd行でこのアプリを呼び出し、結果を直接ffmpegアプリケーションにパイプすることです。ffmpegアプリケーションは、フレームをディスクに保存します。確かにかなり賢いです!
Capture.py:
import cv, sys
cap = cv.CaptureFromCAM(0)
if not cap:
sys.stdout.write("failed CaptureFromCAM")
while True :
if not cv.GrabFrame(cap) :
break
frame = cv.RetrieveFrame(cap)
sys.stdout.write( frame.tostring() )
また、シェルで実行されるコマンドは次のとおりです。
python capture.py | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -an -f avi -r 30 foo.avi
ここで:
- -rは、カメラから出るフレームレートを示します
- -anは「オーディオをエンコードしないでください」と言います
このソリューションは、OpenCV2.4.2を搭載したMacOSXでテストしました。
編集:
カメラから録画し、OpenCVを使用してビデオをディスク上のmp4ファイルに書き込もうとしたことがない場合は、次のようにします。
import cv, sys
cap = cv.CaptureFromCAM(0) # 0 is for /dev/video0
if not cap:
sys.stdout.write("!!! Failed CaptureFromCAM")
sys.exit(1)
frame = cv.RetrieveFrame(cap)
if not frame:
sys.stdout.write("!!! Failed to retrieve first frame")
sys.exit(1)
# Unfortunately, the following instruction returns 0
#fps = cv.GetCaptureProperty(cap, cv.CV_CAP_PROP_FPS)
fps = 25.0 # so we need to hardcode the FPS
print "Recording at: ", fps, " fps"
frame_size = cv.GetSize(frame)
print "Video size: ", frame_size
writer = cv.CreateVideoWriter("out.mp4", cv.CV_FOURCC('F', 'M', 'P', '4'), fps, frame_size, True)
if not writer:
sys.stdout.write("!!! Error in creating video writer")
sys.exit(1)
while True :
if not cv.GrabFrame(cap) :
break
frame = cv.RetrieveFrame(cap)
cv.WriteFrame(writer, frame)
cv.ReleaseVideoWriter(writer)
cv.ReleaseCapture(cap)
私はこれをMacOSXとOpenCV2.4.2のPython2.7でテストしました。