我有蟒蛇,OpenCV的和ffmpeg的内置网络摄像头视频录制节目
它的工作原理确定,除了视频的颜色是比现实更蓝。 这个问题似乎来自图像的颜色格式。
看来,OpenCV的是给BGR图像和ffmpeg的+ libx264期待YUV420P。 我读过YUV420P对应的YCbCr。
OpenCV的从BGR为YCbCr任何转换。 它只有一个转换的YCrCb。
我已经取得了一些searchs并尝试不同的选择,试图OpenCV的图像转换成的东西,可能是确定了的ffmpeg + libx264。 无工作。 在这一点上,我有点失落,我希望任何指针,可以帮助我解决这个问题的颜色。
你是对的,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测试这一点。
你是否尝试过使用切换CB / CR通道OpenCV的拆分和合并 ?
经过转换的公式出现在: http://en.wikipedia.org/wiki/YCbCr ?
该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
我已经回答了这个位置 。 但我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?