尝试捕获异常在OpenCV-python中不起作用

问题描述

因此,我故意将一个不存在于计算机中的文件放入cv2.VideoCapture()中,以测试我放入代码中的try-catch系统,但由于某种原因,它仍然会发出相同的错误,当我没有在代码中插入try-catch时给出。我该如何解决

代码

import numpy as np
import cv2



try:
    cap = cv2.VideoCapture('trial.mkv')
    while (cap.isOpened()):
        ret,frame = cap.read()

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()
except:
    print("no file found")

错误

[ERROR:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-cff9bdsm\opencv\modules\videoio\src\cap.cpp (142) cv::VideoCapture::open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-cff9bdsm\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): trial.mkv in function 'cv::icvExtractPattern'

解决方法

try/except语句捕获到错误并仍然打印stderr消息时,这仅意味着该库只是将所有错误消息发送到stderr

OpenCV库已知存在此问题,并且有解决方法。您应该在此处阅读详细的答案-OpenCv errorHow to stop OpenCV error message from printing in Python

,

我绝对同意@ AzyCrw4282,但我也指出了您的代码中的两个问题,因此,我将其作为答案。

  • 问题1:使用except cv2.error as error捕获错误:

  • except cv2.error as error:
        print("[Error]: {}".format(error))
    

    结果:

  • [Error]: OpenCV(4.0.0) /Users/opencv/modules/highgui/src/window.cpp:350: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
    
    Process finished with exit code 0
    
  • 即使我提供了无效的视频文件,也是如此:

    OpenCV: Couldn't read video stream from file "trial.mkv"
    
    Process finished with exit code 0
    
  • 实际上,如果您使用try-catch,则except cv2.error as error块是有效的。

  • 问题2:请始终检查框架


例如:如果要停止应用程序,请使用:

  • if frame is None
        break
    

    ret,frame = cap.read()
        if ret:
            cv2.imshow('frame',frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    

    如果帧返回则显示

完整代码:

import cv2

try:
    cap = cv2.VideoCapture('dread.mp4')
    while cap.isOpened():
        ret,frame = cap.read()
        if ret:
            cv2.imshow('frame',frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
except cv2.error as error:
    print("[Error]: {}".format(error))

cap.release()
cv2.destroyAllWindows()