使用opencv和ffmpeg制作视频.如何找到合适的颜色格式?

luc*_*luc 10 python opencv ffmpeg image-processing

我有一个用python,opencv和ffmpeg构建的网络摄像头录像机程序

除了视频的颜色比现实更蓝,它才能正常工作.问题似乎来自图像的颜色格式.

似乎OpenCv正在提供BGR图像,而ffmpeg + libx264正在期待YUV420p.我读过YUV420p对应YCbCr.

opencv没有从BGR到YCbCr的转换.它只转换为YCrCb.

我做了一些搜索并尝试了不同的替代方案,尝试将opencv图像转换为ffmpeg + libx264可以正常的东西.没有工作.在这一点上,我有点迷失,我会感谢任何可以帮助我解决这个颜色问题的指针.

kar*_*lip 13

你是对的,OpenCV的默认像素格式是BGR.

ffmpeg端的等效格式是BGR24,因此如果你不想,你不需要将它转换为YUV420p.

这篇文章展示了如何使用python应用程序从网络摄像头捕获帧并将帧写入stdout.目的是在cmd-line上调用此应用程序并将结果直接传递给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() )
Run Code Online (Sandbox Code Playgroud)

要在shell上执行的命令是:

python capture.py | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -an -f avi -r 30 foo.avi
Run Code Online (Sandbox Code Playgroud)

地点:

  • -r给出相机的帧速率
  • -an说"不要编码音频"

我在Mac OS X上使用OpenCV 2.4.2测试了这个解决方案.

编辑:

如果您还没有尝试从相机录制并使用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)
Run Code Online (Sandbox Code Playgroud)

我已经在Mac OS X和OpenCV 2.4.2上使用Python 2.7进行了测试.