我发现了OpenCV,并重用了一段使用cv::imread()的代码。我想打印一个错误消息时,它失败了,我可以检测到,如果有一个错误,但我不能得到这个错误的原因。我启用了详细日志记录,但当我尝试打开一个不存在的文件时,仍然没有收到任何错误。那么,如何才能获得导致cv::imread()失败的错误呢?
cv::imread()
piztneat1#
我想打印一个错误消息,当它失败时,我可以检测是否有错误,但我不能得到这个错误的原因。cv::VideoCapture也一样。你可以从检测哪个类出错开始,例如,你可以使用sys.exc_info()我启用了详细日志记录,但当我尝试打开一个不存在的文件时,仍然没有收到任何错误。下面是一个例子:
sys.exc_info()
import cv2 import sys try: img = cv2.imread('not_avail_img.png') except: print("Error: {}".format(sys.exc_info()[0]))
结果:
Error: <class 'cv2.error'>
因此,结果表明错误是从cv2.error引发的那么,我怎样才能找到导致cv::imread()失败的错误呢?如果我们重新设计代码:
cv2.error
import cv2 try: img = cv2.imread("not_avail_img.png") cv2.imshow("img", img) cv2.waitKey(0) except cv2.error as err: print("Error: {}".format(err))
Error: OpenCV(4.0.0) /Users/Downloads/opencv/modules/highgui/src/window.cpp:350: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
现在没有直接的方法来查找imread错误(据我所知),但是如果您解释错误Assertion failed size.width>0 && size.height>0,则问题是由img变量引起的,因为img是None。您可以使用cv2.error查找和检测与cv2相关的错误。
imread
Assertion failed size.width>0 && size.height>0
img
None
cv2
46scxncf2#
我遇到了另一个类似的问题,发生在调用cv::VideoCapture video(Path_to_video)。video.is_open()得到假,没有详细的错误消息显示。我通过errno得到了深层次的原因,如下面的代码所示。
cv::VideoCapture video(Path_to_video)
video.is_open()
errno
errno = 0; cv::VideoCapture videoCapture(file); if (!videoCapture.isOpened()) { slog::info << "Cannot open " << file << ": " << strerror(errno) << slog::endl; return 1; }
我得到了这样的错误消息
Cannot open xxx.mp4: Inappropriate ioctl for device.
最后我通过这个错误消息解决了这个OpenCV问题。我认为cv.imread必须调用Linux系统API read(),并在发生故障时设置errno。更多详细信息请参考下面的链接。https://github.com/yangwang201911/open_model_zoo/blob/d596c069d5d5342e6d97ce6605992d26d007cd43/demos/security_barrier_camera_demo/cpp/main.cpp#L772
cv.imread
read()
2条答案
按热度按时间piztneat1#
我想打印一个错误消息,当它失败时,我可以检测是否有错误,但我不能得到这个错误的原因。cv::VideoCapture也一样。
你可以从检测哪个类出错开始,例如,你可以使用
sys.exc_info()
我启用了详细日志记录,但当我尝试打开一个不存在的文件时,仍然没有收到任何错误。
下面是一个例子:
结果:
因此,结果表明错误是从
cv2.error
引发的那么,我怎样才能找到导致cv::imread()失败的错误呢?
如果我们重新设计代码:
结果:
现在没有直接的方法来查找
imread
错误(据我所知),但是如果您解释错误Assertion failed size.width>0 && size.height>0
,则问题是由img
变量引起的,因为img
是None
。您可以使用
cv2.error
查找和检测与cv2
相关的错误。46scxncf2#
我遇到了另一个类似的问题,发生在调用
cv::VideoCapture video(Path_to_video)
。video.is_open()
得到假,没有详细的错误消息显示。我通过
errno
得到了深层次的原因,如下面的代码所示。我得到了这样的错误消息
最后我通过这个错误消息解决了这个OpenCV问题。
我认为
cv.imread
必须调用Linux系统APIread()
,并在发生故障时设置errno
。更多详细信息请参考下面的链接。https://github.com/yangwang201911/open_model_zoo/blob/d596c069d5d5342e6d97ce6605992d26d007cd43/demos/security_barrier_camera_demo/cpp/main.cpp#L772