如何得到OpenCV 4.5.0错误消息与cv::imread?

voase2hg  于 2023-03-03  发布在  其他
关注(0)|答案(2)|浏览(202)

我发现了OpenCV,并重用了一段使用cv::imread()的代码。
我想打印一个错误消息时,它失败了,我可以检测到,如果有一个错误,但我不能得到这个错误的原因。
我启用了详细日志记录,但当我尝试打开一个不存在的文件时,仍然没有收到任何错误。
那么,如何才能获得导致cv::imread()失败的错误呢?

piztneat

piztneat1#

我想打印一个错误消息,当它失败时,我可以检测是否有错误,但我不能得到这个错误的原因。cv::VideoCapture也一样。
你可以从检测哪个类出错开始,例如,你可以使用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()失败的错误呢?
如果我们重新设计代码:

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变量引起的,因为imgNone
您可以使用cv2.error查找和检测与cv2相关的错误。

46scxncf

46scxncf2#

我遇到了另一个类似的问题,发生在调用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

相关问题