【问题标题】:Save grayscale video in OpenCV?在 OpenCV 中保存灰度视频?
【发布时间】:2018-10-06 19:17:09
【问题描述】:

我正在尝试将视频保存为 .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')

【问题讨论】:

  • 请提供minimal, complete code您的问题。
  • 我更新了代码,你能帮我弄清楚吗
  • 当我插入 print 语句时,视频编译和运行正常,并给出正确的控制台 o/p,但我得到的 o/p 无法读取,它给出了"Could not demultiplex stream."

标签: python opencv


【解决方案1】:

对于 Windows 操作系统尝试:

out = cv2.VideoWriter(outfilename, fourcc, fps, (width, height), 0)

【讨论】:

  • 也可以在 Linux (Ubuntu) 上工作,方法是在末尾添加“零”参数
  • 只要传入out.write(frame) 的帧已经转换为灰度,这对我有用
【解决方案2】:

.DIVX 可能正在寻找要写入的 3 通道 BGR 图像,但您只提供了单通道图像,因为您正在尝试写入灰度图像

尝试这样做:

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

基本上这将尝试将您的灰度图像转换为 BGR 图像。虽然您的像素值将保持灰色,但这会将 frame 更改为 3 通道图像

【讨论】:

  • 它可以在一台计算机上运行,​​但不能在另一台计算机上运行。可能是编解码器问题?
  • 考虑到OP码,表示有两个连续的转换,cv2.COLOR_BGR2GRAY然后cv2.COLOR_GRAY2BGR。我一直在寻找捷径,比如 cv2.COLOR_BGR2GRAY2BGR ,但什么也没找到。
【解决方案3】:

当您尝试在视频编写器中写入灰度图像时,需要记住 3 件事。 1.读取图片时,保持0后跟','

image = cv2.imread("data/PCB.jpg",0)

2&3。在创建视频编写器时,以相反的方式声明形状并保持 0 跟随 通过 ',' 就像我们在步骤 1 中所做的那样

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (image.shape[1],image.shape[0]),0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多