在 Python (Windows 10) 中无法使用 OpenCV 打开保存的视频
Can't open saved video using OpenCV in Python (Windows 10)
代码读取 train1.mov
文件,显示 cv2.imshow('res', res)
还保存了一个名为 output.avi
的文件。问题是,output.avi 大约 40 kb 并且是空的。但是 cv2.imshow('res', res)
显示了整个视频。然后显示如下错误。
Python代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\Users\khan1\Desktop\python project\color_threshold\train1.mov')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('C:\Users\khan1\Desktop\python project\color_threshold\output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
_, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_green = np.array([40, 60, 60])
upper_green = np.array([80, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.GaussianBlur(mask, (7, 7), 0)
res = cv2.bitwise_and(frame, frame, mask=mask)
out.write(res)
cv2.namedWindow("res", cv2.WINDOW_NORMAL)
cv2.imshow('res', res)
if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit
break
# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()
错误:
OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp, line 9815
Traceback (most recent call last):
File "C:/Users/khan1/Desktop/python project/color_threshold/savevid.py", line 19, in <module>
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.error: C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp:9815: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::cvtColor
Process finished with exit code 1
我该如何解决?
很明显你的错误发生在最后一帧;这就是为什么你的 imshow
一直在工作,但它出错并且没有完成 while
循环后发生的视频的编写。
cap.read()
返回的第一个值是关于是否读取帧 exists/was 的布尔值。因此,如果框架被读取,您可以简单地在代码中插入一个 if-else
块来执行处理,如果没有,则 quit
执行 while
循环,这样您就可以完成框架的编写。
这应该修补您的代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\Users\khan1\Desktop\python project\color_threshold\train1.mov')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('C:\Users\khan1\Desktop\python project\color_threshold\output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_green = np.array([40, 60, 60])
upper_green = np.array([80, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.GaussianBlur(mask, (7, 7), 0)
res = cv2.bitwise_and(frame, frame, mask=mask)
out.write(res)
cv2.namedWindow("res", cv2.WINDOW_NORMAL)
cv2.imshow('res', res)
if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit
break
else:
break
# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()
查看同一过程的示例 here。
代码读取 train1.mov
文件,显示 cv2.imshow('res', res)
还保存了一个名为 output.avi
的文件。问题是,output.avi 大约 40 kb 并且是空的。但是 cv2.imshow('res', res)
显示了整个视频。然后显示如下错误。
Python代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\Users\khan1\Desktop\python project\color_threshold\train1.mov')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('C:\Users\khan1\Desktop\python project\color_threshold\output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
_, frame = cap.read()
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_green = np.array([40, 60, 60])
upper_green = np.array([80, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.GaussianBlur(mask, (7, 7), 0)
res = cv2.bitwise_and(frame, frame, mask=mask)
out.write(res)
cv2.namedWindow("res", cv2.WINDOW_NORMAL)
cv2.imshow('res', res)
if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit
break
# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()
错误:
OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp, line 9815
Traceback (most recent call last):
File "C:/Users/khan1/Desktop/python project/color_threshold/savevid.py", line 19, in <module>
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
cv2.error: C:\build\master_winpack-bindings-win32-vc14-static\opencv\modules\imgproc\src\color.cpp:9815: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::cvtColor
Process finished with exit code 1
我该如何解决?
很明显你的错误发生在最后一帧;这就是为什么你的 imshow
一直在工作,但它出错并且没有完成 while
循环后发生的视频的编写。
cap.read()
返回的第一个值是关于是否读取帧 exists/was 的布尔值。因此,如果框架被读取,您可以简单地在代码中插入一个 if-else
块来执行处理,如果没有,则 quit
执行 while
循环,这样您就可以完成框架的编写。
这应该修补您的代码:
import numpy as np
import cv2
cap = cv2.VideoCapture('C:\Users\khan1\Desktop\python project\color_threshold\train1.mov')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('C:\Users\khan1\Desktop\python project\color_threshold\output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
ret, frame = cap.read()
if ret:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
lower_green = np.array([40, 60, 60])
upper_green = np.array([80, 255, 255])
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.GaussianBlur(mask, (7, 7), 0)
res = cv2.bitwise_and(frame, frame, mask=mask)
out.write(res)
cv2.namedWindow("res", cv2.WINDOW_NORMAL)
cv2.imshow('res', res)
if (cv2.waitKey(1) & 0xFF) == ord('q'): # Hit `q` to exit
break
else:
break
# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()
查看同一过程的示例 here。