很明显,您的错误发生在最后一帧;这就是为什么您的imshow仍然在工作,但是它出错了,并且没有完成while循环之后发生的视频的编写。在
cap.read()返回的第一个值是判断帧是否存在/是否被读取的布尔值。因此,您只需在代码中插入if-else块来执行处理,如果帧被读取,quit循环{},这样就可以完成框架的编写。在
这将修补您的代码: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。在