【问题标题】:Try-Catch Exception won't work in OpenCV-pythonTry-Catch Exception 在 OpenCV-python 中不起作用
【发布时间】:2020-12-23 06:55:02
【问题描述】:

所以我特意在我的计算机中不存在的 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'

【问题讨论】:

    标签: python opencv opencv-python


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我绝对同意@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
        
      • 如果您使用except cv2.error as error,实际上try-catch 块正在工作。

      • 问题 #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()
      

      【讨论】:

      • 很高兴,如果我能帮忙:)
      • 顺便说一句,这不适用于远程 RTSP url。例如,如果您执行cv2.VideoCapture('some_remote_rtsp_url'),那么它不会捕获任何抛出的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多