我正在使用OpenCV创建彩色视频(RGB)并将生成的视频文件上传到服务器。由于彩色视频文件大小较大,在当前可用带宽下上传会成为瓶颈。因此,我试图通过将其转换为OpenCV中的灰度视频来减小文件大小。
以下是我目前工作的OpenCV实现:
cap = cv2.VideoCapture(RGB_video_filepath)
fps = cap.get(cv2.CAP_PROP_FPS)
print("Input Video FPS: ".format(fps))
outputfilepath = "gray_video_output.avi"
mjpg_forcc = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
divx_forcc = cv2.VideoWriter_fourcc(*'DIVX')
xvid_forcc = cv2.VideoWriter_fourcc(*'XVID')
fmpp4_codec = cv2.VideoWriter_fourcc('F','M','P','4')
mp4v_codec = cv2.VideoWriter_fourcc(*'MP4V')
vid_writer = cv2.VideoWriter(outputfilepath, mjpg_codec, 2, (640, 480), 0)
while cv2.waitKey(1) < 0:
# get frame from the video
hasFrame, frame = cap.read()
# Stop the program if reached end of video
if not hasFrame:
print("Done processing !!!")
print("Output file is stored as ", outputfilepath)
break
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
vid_writer.write(gray_frame)
print("Frame shape: {} {}".format(frame_count, frame.shape))
cv2.imshow("Camera frame", frame)
cv2.waitKey(1)
print("Total frames: {}".format(frame_count))
vid_writer.release()
cap.release()
使用以上的工作流程,我创建了一个灰度视频,但是我发现视频文件大小几乎相同(RGB视频文件大小:25 MB,灰度视频文件大小:23 MB)。
在深入OpenCV之后,我发现尽管OpenCV在Linux操作系统上使用FFMPEG进行视频文件编写,但它将灰度(单通道)帧复制3次并将其作为3个通道写入视频中。
我尝试使用下面的方式将RGB视频文件转换为灰度视频文件:
ffmpeg -i inputvideofile -vf hue=s=0 outputvideofile
在这里,我将色调和饱和度通道保留为空白,令人惊讶的是RGB视频文件(25 MB)转换为灰度图像,文件大小缩小到6 MB。 我很好奇是否可以使用OpenCV实时将RGB转换为灰度,从而实现视频文件大小的减小?
感谢任何帮助/更新。谢谢!!
ffmpeg
(使用有效参数)作为子进程启动,并通过管道将其输入连接到Python程序的输出。然后,您只需将原始帧写入stdout
,ffmpeg
将制作您的视频,并且您可以免费获得多处理器,因为视频压缩将在单独的进程中进行。我曾经用过CImg
而不是OpenCV
,并且是用C语言编写的,但您可以理解这个想法... https://dev59.com/aoDba4cB1Zd3GeqPG6eU#46710797 - Mark Setchell