检测/避免" JPEG的过早结束"在cv2 - python中

时间:2015-11-05 15:47:13

标签: python opencv

我有一个从外部程序保存到文件(例如每2秒)的图像流(无法控制它)。当我尝试读取该图像时,有时会在写入时读取该图像,因此我从OpenCV获取有关JPEG结尾的消息。有没有办法测试文件是否坏,如果是这样等待一段时间然后尝试重新读取它?

...谢谢

3 个答案:

答案 0 :(得分:2)

我研究了一下这个“错误”,它似乎是C中的警告,python无法正确检测到。这是一个非常棘手的问题,因为图像不完整而发生。检测图像是否正确结束(使用b'\ xff \ xd9'字符)似乎有效:

with open(os.path.join(path, file), 'rb') as f:
    check_chars = f.read()[-2:]
if check_chars != b'\xff\xd9':
    print('Not complete image')
else:
    imrgb = cv2.imread(os.path.join(path, file), 1)

答案 1 :(得分:1)

对我有用的解决方案是将文件读取为二进制数据,然后将其转换为numpy.array:

img = None

while True:
    with open(image_path, 'rb') as img_bin:
        buff = StringIO.StringIO()
        buff.write(img_bin.read())
        buff.seek(0)
        temp_img = numpy.array(PIL.Image.open(buff), dtype=numpy.uint8)
        img = cv2.cvtColor(temp_img, cv2.COLOR_RGB2BGR)

    if img is not None:
        break

答案 2 :(得分:1)

我发现以下解决方案更优雅,更省力。但是,它需要skimage软件包。

from skimage import io
try:
    _ = io.imread(path)
    img = cv2.imread(path)
    # Do stuff with img
except Exception as e:
    print(e)
    return False

结果是skimage捕获了异常,而opencv没有。因此,在opencv之前使用skimage.io读取图像应该可以解决问题。

来源:This medium post