用opencv和ffmpeg制作视频。如何找到正确的颜色格式?

2024-05-29 05:55:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用python、opencv和ffmpeg构建的网络摄像机视频录制程序

它工作正常,只是视频的颜色比现实更蓝。问题似乎来自图像的颜色格式。

似乎OpenCv正在提供BGR图像,ffmpeg+libx264期待YUV420p,我读到YUV420p对应于YCbCr。

opencv没有从BGR到YCbCr的转换。它只有一个到YCrCb的转换。

我已经做了一些搜索,并尝试了不同的方法来尝试将opencv图像转换为ffmpeg+libx264可以接受的图像。没有人在工作。在这一点上,我有点迷茫,我希望任何指针可以帮助我解决这个颜色问题。


Tags: 图像程序网络视频颜色格式opencvffmpeg
3条回答

你试过用splitmerge切换OpenCV中的Cb/Cr通道吗?

检查了:http://en.wikipedia.org/wiki/YCbCr中的转换公式?

没错,OpenCV的默认像素格式是BGR

ffmpeg端的等效格式将是BGR24,因此如果您不想将其转换为YUV420p,则不需要将其转换为YUV420p。

This post演示如何使用python应用程序从网络摄像头捕获帧并将帧写入stdout。其目的是在命令行上调用这个应用程序,并将结果直接传递到ffmpeg应用程序,该应用程序将帧存储在磁盘上。真聪明!

捕获.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() )

在shell上执行的命令是:

python capture.py | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x480 -r 30 -i - -an -f avi -r 30 foo.avi

Where:

  • -r gives the frame rate coming off the camera
  • -an says "don't encode audio"

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

编辑:

如果您没有尝试从相机录制视频并使用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测试过了。

相关问题 更多 >

    热门问题