无法使用 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 的初学者,非常感谢您的帮助。
我看到两个可能的问题:
你的 write()
放错地方了。它必须在 for
循环内。你只写最后一张图。
如果原始文件的大小与 (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()
我正在尝试使用此代码 (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 的初学者,非常感谢您的帮助。
我看到两个可能的问题:
你的
write()
放错地方了。它必须在for
循环内。你只写最后一张图。如果原始文件的大小与
(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()