制作用的OpenCV和FFMPEG的视频。 如何找到正确的颜色格式?(Making a vide

2019-07-31 17:23发布

我有蟒蛇,OpenCV的和ffmpeg的内置网络摄像头视频录制节目

它的工作原理确定,除了视频的颜色是比现实更蓝。 这个问题似乎来自图像的颜色格式。

看来,OpenCV的是给BGR图像和ffmpeg的+ libx264期待YUV420P。 我读过YUV420P对应的YCbCr。

OpenCV的从BGR为YCbCr任何转换。 它只有一个转换的YCrCb。

我已经取得了一些searchs并尝试不同的选择,试图OpenCV的图像转换成的东西,可能是确定了的ffmpeg + libx264。 无工作。 在这一点上,我有点失落,我希望任何指针,可以帮助我解决这个问题的颜色。

Answer 1:

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

在ffmpeg的侧等效格式是BGR24,所以你并不需要将其转换为YUV420P,如果你不想。

这篇文章展示了如何使用Python应用程序,以获取来自网络摄像头帧和帧写入stdout。 目的是直接调用此应用在CMD线和管结果到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说:“不把音频编码”

我测试了这个解决方案在我的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)

我与Python 2.7在Mac OS X和OpenCV 2.4.2测试这一点。



Answer 2:

你是否尝试过使用切换CB / CR通道OpenCV的拆分和合并 ?



Answer 3:

经过转换的公式出现在: http://en.wikipedia.org/wiki/YCbCr ?



Answer 4:

该libx264编解码器能够处理图像BGR。 无需使用任何转换为​​YCbCr。 没有必要给一个spcific pix_ftm到FFmpeg的。 我用的是RGB,它是造成视频上的偏蓝效果。

该解决方案是简单地使用由照相机重新调整所述原始图像而无需任何转换。 :)

我在以前的调查尝试这样做,它崩溃的应用程序。 该解决方案是复制由摄像机返回的帧。

    frame = opencv.QueryFrame(camera)
    if not frame:
        return None, None

    # RGB : use this one for displaying on the screen
    im_rgb = opencv.CreateImage(self.size,  opencv.IPL_DEPTH_8U, 3)
    opencv.CvtColor(frame, im_rgb, opencv.CV_BGR2RGB)

    # BGR : Use this one for the video
    im_bgr = opencv.CreateImage(self.size,  opencv.IPL_DEPTH_8U, 3)
    opencv.Copy(frame, im_bgr)

    return im_rgb, im_bgr


Answer 5:

我已经回答了这个位置 。 但我VidGear Python库自动流水线OpenCV的帧到FFmpeg的全过程,也有力处理格式转换 。 这里有一个基本的Python的例子:

# import libraries
from vidgear.gears import WriteGear
import cv2

output_params = {"-vcodec":"libx264", "-crf": 0, "-preset": "fast"} #define (Codec,CRF,preset) FFmpeg tweak parameters for writer

stream = cv2.VideoCapture(0) #Open live webcam video stream on first index(i.e. 0) device

writer = WriteGear(output_filename = 'Output.mp4', compression_mode = True, logging = True, **output_params) #Define writer with output filename 'Output.mp4' 

# infinite loop
while True:

    (grabbed, frame) = stream.read()
    # read frames

    # check if frame empty
    if not is grabbed:
        #if True break the infinite loop
        break


    # {do something with frame here}
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # write a modified frame to writer
        writer.write(gray) 

        # Show output window
    cv2.imshow("Output Frame", frame)

    key = cv2.waitKey(1) & 0xFF
    # check for 'q' key-press
    if key == ord("q"):
        #if 'q' key-pressed break out
        break

cv2.destroyAllWindows()
# close output window

stream.release()
# safely close video stream
writer.close()
# safely close writer

来源: https://github.com/abhiTronix/vidgear/wiki/Compression-Mode:-FFmpeg#2-writegear-classcompression-mode-with-opencv-directly

您可以检查出充分VidGear文档更先进的应用和令人兴奋的功能。

希望帮助!



文章来源: Making a video with opencv and ffmpeg. How to find the right color format?