浏览更多内容,可访问: http://www.growai.cn

1. 问题

今天测试opencv文件的视频抓取和保存功能,测试代码如下,运行时视频可以正常播放,但是保存的output.mp4文件打不开(mac os),换了多个播放器都不行,仔细看才发现文件之后不到8k,也就是文件没有正确保存。尝试了安装ffmpeg,切换了fourcc文件中的配置,都不能解决问题。

import numpy as np
import cv2
cap = cv2.VideoCapture('M.AVI')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640, 480))
while (cap.isOpened()):
  ret, frame = cap.read()
  if ret == True:
    frame = cv2.flip(frame, 0)
    out.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break
  else:
    break
cap.release()
out.release()
cv2.destroyAllWindows()

2.解决方案

​ 最终在知乎上找到了具体的原因(下面会有链接),当读取保存视频文件时要求尺寸必须保持一致,也就是要求读取的**‘M.AVI’视频文件和out中的后面的(640,480)保持一致。在这里不尺寸有问题,还需要更改尺寸中的文件’XVID’改为‘MJPG’**,更改后的代码如下:

import numpy as np
import cv2
cap = cv2.VideoCapture('M.AVI')
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print("width:",width, "height:", height)
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height))
while (cap.isOpened()):
  ret, frame = cap.read()
  if ret == True:
    frame = cv2.flip(frame, 0)
    out.write(frame)
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
      break
  else:
    break
cap.release()
out.release()
cv2.destroyAllWindows()

参考:链接

ubuntu系统OpenCV VideoCapture类无法打开指定路径mp4视频文件,推敲原因应该是编译 OpenCV 4.6.0 时没有包含ffmpeg视频解码器或是包含了有问题的ffmpeg库。测试结果表明,只有通过方案一编译的OpenCV 才可以成功无警告打开视频文件并抓取帧图像。 使用opencv来保存录制的视频,但是保存后的视频就是打不开,网上查找了很多资料,后面发现原来是保存的视频尺寸和被录制的视频尺寸不一样造成的,原本的代码如下 import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.VideoWriter_fourcc(*'mp4v') videoWrite = cv2.VideoWriter(r'../videos/test.mp4', fourcc, 30, (640, 480)) while... 项目需要写入相机视频,于是研究了一下cv2.VideoWriter,发现有些时候视频能播放有些时候不能播放,不能播放的视频文件大小都很小,便查找原因。研究大半小时,发现一个隐藏的问题原因。经搜索网上相关内容基本没有提到过这个原因。现将其记录下来。 “opencv-python cv2.VideoWriter() 导出视频无法播放的四个原因” 【最重要】VideoWriter对象在程序结束前必须通过VideoWriter.release()函数释放!!!否则视频将会像如下一样无法播放!笔者前面是死循环获取 今天写了一段代码,打开一段视频,然后再使用CV::VideoWriter保存处理后视频,结果能够成功保存但是打不开。 保存的代码如下: pVideoPro->SetOutput("output001.mp4"); 函数的内容如下所示 /******************************保存视频****************************/ bool VideoProcessor::SetOutput(const string& filename, int codec, 我正在尝试使用OpenCv’s Website中的基本示例代码打开视频文件.我已经尝试了我能在网上找到的所有内容,但无论我得到什么错误VIDEOIO(cvCreateFileCapture_AVFoundation (filename)): raised unknown C++ exception!我不知道发生了什么事.我的示例代码如下import numpy as npimport cv2pri... import cv2import threading #python 多线程操作库class RecordingThread(threading.Thread):def __init__(self, name, camera):threading.Thread.__init__(self)self.name = nameself.isRunning = Trueself.cap = came... 最近在利用opencv-python截取触发点时刻视频流的过程中遇到一个问题:利用opencv截取的视频片段无法正常播放。 上网查阅很多方法,废了很长时间才得以解决(问题很简单,但废了很长时间)。 首先,由查得的方法总结,可能存在的问题包括几方面: 1.编码方式不对 2.视频写入的图像尺寸与画布尺寸不对应 下面提供一段读取的代码,按照此格式改写自己的需求代码即可。 import numpy as np import cv2 cap = cv2.VideoCapture('test.mp4') fourcc 今日采用PythonOpenCV的video,生成的视频总是只有几k,且无法播放。网上搜了一些方法,记录解决办法。纪念自己消逝的2h。 fourcc = cv2.VideoWriter_fourcc(*'MJPG') fps = 10 size = (img_pattern.shape[1], img_pattern.shape[0]) writer = cv2.VideoWriter(args.output, fourcc, fps, size, False) for frame in frame cap = cv.VideoCapture(videoFile) print(cap.get(cv.CAP_PROP_FRAME_WIDTH)) print(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) # 重新定义视频大小,并将其保存到指定路径中 fourcc = cv.VideoWriter_fourcc(*'XVID') videoFile = os.path.join("..\\demoDatasets\\videos4", "te.. # 通过相机捕获视频流。opencv中通过 VideoCapture 对象捕获视频,其参数是相机设备索引号或是视频文件的名字。 # 本地设备为0,如果你还有其他的相机设备,可设为1,2,... # 可通过cap.isOpened() 检查相机是否初始化,有可能有些错误是我能成功初始化造成的 import numpy as np import cv2 cap = cv2.VideoCapture(0) # frame_width = ca 我电脑里有Altrun和迅雷精简版,因为常使用休眠,基本上一周多才真正关机一次,其余都使用休眠。 一次重启后,发现altrun一打开就说“程序已停止工作”。然后又发现迅雷精简版也打不开,没说“已停止工作”,具体是运行后立即退出。 经回忆,原来是上次我用 bcdedit.exe /set {current} nx AlwaysOff关闭了数据执行保护。