运行cv.VideoCapture(path)
命令时(cv是opencv-python导入)
我收到以下错误:
OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-kh7iq4w7\opencv\modules\videoio\src\cap_images.cpp:253:
error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file):
res\Confetti_Loop.mov in function 'cv::icvExtractPattern'
我已经在3台不同的计算机上测试过它(都是Windows 10)(使用相同的导入),只有一台运行了以下代码,没有错误。
"""Separate thread file to deal with videos."""
from queue import Empty
import cv2 as cv
import pygame
from Constants import LOCAL_IO
def get_video(path, size, queue, max_queue, aspect=0):
"""Get video and add to queue once properly formatted."""
video = cv.VideoCapture(path)
if aspect == 0:
size = keep_aspect_ratio(video, *size)
elif aspect == 1:
size = cut(video, *size)
else:
size = (int(size[0]), int(size[1]))
while True:
try:
get = queue.get(False)
except Empty:
pass
else:
if get[0] == LOCAL_IO["Stop"]:
break
ret, frame = video.read()
if not ret:
video.set(2, 0.0)
ret, frame = video.read()
frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
frame = cv.resize(frame, size)
frame = frame.swapaxes(0, 1)
surface = pygame.surfarray.make_surface(frame)
surface.set_colorkey((0, 0, 0))
max_queue.put((LOCAL_IO["Video"], surface))
def keep_aspect_ratio(vid, bx, by):
"""Scales image to fit into bx/by, this method will retain the original image's aspect ratio."""
ix = vid.get(cv.CAP_PROP_FRAME_WIDTH)
iy = vid.get(cv.CAP_PROP_FRAME_HEIGHT)
if ix > iy: # fit to width
scale_factor = bx / float(ix)
sy = scale_factor * iy
if sy > by:
scale_factor = by / float(iy)
sx = scale_factor * ix
sy = by
else:
sx = bx
else: # fit to height
scale_factor = by / float(iy)
sx = scale_factor * ix
if sx > bx:
scale_factor = bx / float(ix)
sx = bx
sy = scale_factor * iy
else:
sy = by
return int(sx), int(sy)
def cut(vid, bx, by):
"""Scales image without changing aspect ratio but instead growing to at least the size of box bx/by."""
ix = vid.get(cv.CAP_PROP_FRAME_WIDTH)
iy = vid.get(cv.CAP_PROP_FRAME_HEIGHT)
if bx / float(ix) > by / float(iy): # fit to width
scale_factor = bx / float(ix)
sy = scale_factor * iy
sx = bx
else: # fit to height
scale_factor = by / float(iy)
sx = scale_factor * ix
sy = by
return int(sx), int(sy)
为什么会这样呢?
编辑:
看起来是我从github repo重新下载视频时读取的文件有问题,它工作正常。视频文件是用git lfs上传的,这是在整个repo的第一次下载时损坏的原因吗?
2条答案
按热度按时间i7uq4tfw1#
根据Olli-Pekka Heinis在https://github.com/opencv/opencv-python/issues/284上。他说:
我能想到的唯一原因是PyInstaller在打包过程中不复制FFmpeg dll。
如果你看一下例如... Python37\Lib\site-packages\cv 2文件夹,在cv2.cp37-win_amd64.pyd旁边有类似opencv_videoio_ffmpeg412_64.dll的东西。
在PyInstaller中创建的包中是否存在opencv_videoio_ffmpeg412_64.dll文件?如果不存在,请将其添加到spec文件(二进制文件):https://pyinstaller.readthedocs.io/en/stable/spec-files.html#spec-file-operation
nqwrtyyt2#
看起来这个错误信息可能会在找不到文件时显示,例如在opencv 4.5.5中