无法使用cv2.videowriter写入视频文件



我试图使用使用此代码(https://github.com/Aman-Preet-Singh-Gulati/Vehicle-count-detect)来检测车辆的数量并编写带有边界框的视频文件。我已经成功地在图像文件上使用了这段代码,但是由于某种原因,代码没有生成视频文件。

我正在使用haar级联汽车模型(验证.xml文件适用于图片)并使用以下代码编写视频文件:

cascade_src = 'cars.xml'
video_src = 'Cars.mp4'
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, (450,250))  

生成的文件只有几kb,无法播放。我正试图得到一些帮助来弄清楚如何使这一步工作。

假设这一步有效,下一个代码块应该生成边界框并写入文件。这会创建一个新文件还是用边界框覆盖以前生成的视频文件?

while True:
ret, img = cap.read()
if (type(img) == type(None)):
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)
for (x,y,w,h) in cars:
cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,255),2)
video.write(img) 
video.release()

非常感谢!我完全是Python的初学者,所以感谢您的帮助。

我看到两个可能的问题:

  1. 你把write()放错地方了。它必须在for环内。你只写最后一张图片

  2. 如果原始文件的大小与(450,250)不同,那么您必须在写入前调整图像大小。它不会自动调整它的大小,但它会跳过图像,如果它有错误的大小。最后,它会创建一个没有图像/帧的文件-所以它会创建一个破碎的文件。


import cv2
cascade_src = 'cars.xml'
video_src = 'Cars.mp4'
cap = cv2.VideoCapture(video_src)
car_cascade = cv2.CascadeClassifier(cascade_src)
video = cv2.VideoWriter('result.avi', cv2.VideoWriter_fourcc(*'DIVX'), 15, (450, 250))
# --- loop ---
while True:
ret, img = cap.read()
if ret is False:
break
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cars = car_cascade.detectMultiScale(gray, 1.1, 2)

for x, y, w, h in cars:
cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 255), 2)
img = cv2.resize(img, (450, 250))
video.write(img)
# --- after loop ---
video.release()
cap.release()

最新更新