Сохранить видео в оттенках серого в OpenCV? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь сохранить видео в формате .avi, но получаю сообщение об ошибке "could not demultiplex stream". В первую очередь я хочу сохранить видео в оттенках серого.

Есть ли какие-то конкретные codec, которые мне нужно использовать?

Прямо сейчас я попробовал с XVID, DIVX

import imutils
import cv2
import numpy as np

interval = 30
outfilename = 'output.avi'
threshold=100.
fps = 10

cap = cv2.VideoCapture("video.mp4")

ret, frame = cap.read()
height, width, nchannels = frame.shape

fourcc = cv2.cv.CV_FOURCC(*'DIVX')
out = cv2.VideoWriter( outfilename,fourcc, fps, (width,height))

ret, frame = cap.read()
frame = imutils.resize(frame, width=500)
frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

while(True):

  frame0 = frame

  ret, frame = cap.read()
  frame = imutils.resize(frame, width=500)
  frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)

  if not ret:
    deletedcount +=1
    break

  if np.sum( np.absolute(frame-frame0) )/np.size(frame) > threshold:
    out.write(frame)
  else:
    print "Deleted"

  cv2.imshow('Feed - Press "q" to exit',frame)

  key = cv2.waitKey(interval) & 0xFF

  if key == ord('q'):
    print('received key q' )
    break

cap.release()
out.release()
print('Successfully completed')

Ответы [ 2 ]

0 голосов
/ 14 июля 2018

Для ОС Windows попробуйте:

out = cv2.VideoWriter(outfilename, fourcc, fps, (width, height), 0)
0 голосов
/ 28 апреля 2018

Возможно, что .DIVX ищет 3-канальное изображение BGR для записи, но вы предоставляете ему только одноканальное изображение, так как вы пытаетесь написать изображение в градациях серого

Попробуйте сделать это:

frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)

по сути, это попытается преобразовать ваше изображение в градациях серого в изображение BGR.Пока ваши значения пикселей будут оставаться серыми, это изменит frame на 3-канальное изображение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...