I am creating Color Video(RGB) using OpenCV in my application and generated video file needs to be uploaded to server. Color video file size is large enough to create bottleneck while uploading to server in the current bandwidth available. So, i tried to reduce the file size by converting it to grayscale video in the opencv. Please find below the OpenCV implementation of my current work:
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()
Using above workflow, i created the GRAY scale video, but i found that video file sizes are almost same (RGB video file size : 25 MB, Gray scale video size: 23 MB).
After digging into OpenCV, i found that OpenCV copies the grayscale(single channel) frame 3 times and writes into video as 3 channel although OpenCV uses FFMPEG for video file writing on Linux based OS.
I tried to convert the same RGB video file to Grayscale video file using FFMPEG as below:
ffmpeg -i inputvideofile -vf hue=s=0 outputvideofile
Here, i kept the Hue and saturation channel to be empty and surprisingly RGB video file(25 MB) gets converted to gray scale with file size reduced to 6 MB.
**I am curious to know if we can achieve the video file size reduction by converting RGB to Gray scale using OpenCV on the fly? **
Any help/update is appreciated. Thanks!!