我想读取视频文件,将其分成单独的帧,将每个帧调整为最大宽度,然后获取最终图像的宽度和高度。
我已经尝试过了:
为True时:
vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
frame = vs.read()
frame = imutils.resize(frame, width=400)
# grab the frame dimensions and convert it to a blob
w, h = cv.GetSize(frame)
但得到了:
Traceback (most recent call last):
File "real_time_object_detection.py", line 52, in <module>
frame = imutils.resize(frame, width=400)
File "/home/pi/.virtualenvs/cv/lib/python3.5/site-packages/imutils/convenience.py", line 69, in resize
(h, w) = image.shape[:2]
AttributeError: 'tuple' object has no attribute 'shape'
为什么它抱怨imutils/
中的一行?我该怎么办?
答案 0 :(得分:2)
read方法返回两个变量,第一个是成功变量,它是一个布尔值(如果捕获了一个帧则为True,否则为False),第二个是该帧。您可能正在阅读带有3个通道帧的视频,并且该帧通常是一个numpy数组,因此可以使用shape属性。
我建议使用cv2.resize来调整大小。
vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
_, frame = vs.read()
(w, h, c) = frame.shape
#syntax: cv2.resize(img, (width, height))
img = cv2.resize(frame,(400, h))
print(w, h)
print(img.shape)
>> 480 640
(640, 400, 3) #rows(height), columns(width), channels(BGR)
w
和h
存储视频帧的原始宽度和高度,而img.shape
具有调整后的宽度和高度
答案 1 :(得分:1)
我认为您传递的frame变量不是一个numpy数组,而是一个元组。因此,错误。检查视频是否被正确读取。执行print(type(frame))
并检查它是否为numpy,以确保正确读取了图像。 imutils.resize()是使用cv2.resize函数的类。这是这样的
vs = cv2.VideoCapture(args["video"])
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
ret, frame = vs.read()
#inside of imutils.resize()
w,h,c=frame.shape
r = 400 / float(w)
dim = (400, int(h * r))
new_frame=cv2.resize(image,dim)