Video corrupted when grayscale applied

Question:

I try to convert a video in grayscale with the following code :

import cv2
import numpy as np
# video from https://www.pexels.com/video/drops-of-liquid-on-a-tray-to-be-use-as-samples-3195394/
cap = cv2.VideoCapture('video.mp4')


# Check if camera opened successfully
if (cap.isOpened()== False):
  print("Error opening video stream or file")
down_width = 1800
down_height = 700
down_points = (down_width, down_height)
#fourcc = cv2.VideoWriter_fourcc(*'mp4v')
#fourcc = cv2.VideoWriter_fourcc(*'X264')
#fourcc = cv2.VideoWriter_fourcc(*'DIVX')

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
#fourcc = cv2.VideoWriter_fourcc(*'avc1')
#fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
out = cv2.VideoWriter('outpy.avi', fourcc, 20, (down_width, down_height))
j=0
jmax=100
while(cap.isOpened()):

  # Capture frame-by-frame
  ret, frame = cap.read()
  j = j + 1
  if ret == True:
    print(j)
    shrinked_down = frame[0:down_height,0:down_width]
    gray = cv2.cvtColor(shrinked_down, cv2.COLOR_BGR2GRAY)
    #cv2.imshow('Frame',gray)
    #cv2.waitKey(0)
    #out.write(shrinked_down) # This is working well
    out.write(gray)
    if j>jmax:
      print("j>jmax")
      break

  else:
    break

# When everything done, release the video capture object
cap.release()
out.release()

print("This is the end")

The video is cropped and cut to 100 frames. Everything go well if I write the color version (out.write(shrinked_down)), but the grayscale image gives corrupted file. Also, I can show the grayscale frame. Do you have an idea of the error?

Asked By: Francois Dion

||

Answers:

VideoWriter has a fifth argument which is isColor, when true as by default it expects RGB frames, setting it to false will get your code to work correctly.

out = cv2.VideoWriter('outpy.avi', fourcc, 20, (down_width, down_height),False)
Answered By: Ahmed AEK
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.