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

Cannot write a video file using 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))  

生成的文件有几千字节,无法播放。我正在尝试获得一些帮助来弄清楚如何使这一步起作用。

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

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) 不同,那么您必须在写入前调整图像大小。它不会自动调整大小,但如果尺寸错误,它会跳过图像。最后它会创建没有 images/frames 的文件 - 所以它会创建损坏的文件。


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()