在 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