CV2.imread() Python 图像未加载且未显示错误

时间:2021-02-20 04:08:11

标签: python image opencv ubuntu cv2

在我使用 Apache2 托管在 Ubuntu 上的 python flask 程序中,我编写的程序通常能够使用 imread 来压缩和处理图像。即使文件路径正确并且它是现有文件并且不返回任何错误消息,代码现在也无法访问图像。这似乎发生在不依赖于文件类型的任何类型的图像上,并且如果与此问题相关,代码有时会返回无类型不能下标。提前感谢您的任何帮助!代码:

img = cv2.imread(file_path)
height, width, _ = img.shape
roi = img[0: height, 0: width]
_, compressedimage = cv2.imencode(".jpg", roi, [1, 90])
file_bytes = io.BytesIO(compressedimage)

2 个答案:

答案 0 :(得分:0)

<块引用>

代码有时返回无类型

在我看来,您提供的文件路径可能不正确。我这样说是因为 cv2.imread 不会为不存在的文件路径抛出错误:

img = cv2.imread("/non/existent/image.jpeg")

而是返回 None:

img is None

(返回 True)。您的代码将在 img.shape 行上失败。因此,您可以在提供给 cv2.imread 之前检查文件路径是否正确:

assert os.path.isfile(file_path)

或者您可以在完成 assert img is not None 之后再继续之前 imread

编辑:

我看到您声称您已检查文件路径是否正确且文件是否存在。但是你自己在说

<块引用>

代码有时会返回一个none type is not subscriptable

这是因为 img[0: height, 0: width] 您试图索引/下标 None。

您可以检查是否输入 None[0] 会得到相同的错误 TypeError: 'NoneType' object is not subscriptable。所以我仍然觉得图像路径不正确或者它不是一个有效的图像文件(除了列出的扩展名here之外还有一些其他的扩展名)。在这两种情况下,您都会在 None 上获得 imread

由于您提供的代码片段是较大应用程序的一部分,问题可能出在其他地方,有时文件路径有效,有时无效?我现在只是猜测。

答案 1 :(得分:0)

您不能期望 cv2.imshow()flaskapache 内工作。

  • apache 启动时,它通常会将用户切换到名为 www 的用户和组,因此它没有相同的环境 (PATH, HOME { {1}} 和其他变量),就像您从位于屏幕前的终端运行某些内容一样。

  • 如果您将 DISPLAY 用户添加到自己的用户,则它们甚至不会安装相同的 Python 模块。

  • 它也没有 www 可以应用 tty 来判断您是否按下了某个键 - 例如退出。

  • 它也无权在您的屏幕上绘图 - 甚至不知道您是谁,或者您正坐在众多潜在的附加屏幕/会话中的哪一个。

也许可以考虑查看 logging 模块来调试/监控您的脚本,并记录 cv2.waitKey() 之前的图像路径及其文件大小及其 cv2.imread()shape 之后.