cv2.imread总是返回NoneType

32

cv2.imread总是返回NoneType

我正在使用Python 2.7版本和OpenCV 2.4.6在64位Windows 7上。

也许这是某种错误或权限问题,因为在另一台计算机上相同的Python和cv2软件包安装可以正常工作。 下面是代码:

im = cv2.imread("D:\testdata\some.tif",CV_LOAD_IMAGE_COLOR)

我从http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv下载了OpenCV。感激不尽,希望能得到一些提示。


尝试使用cv2.imread(r"D:\testdata\some.tif",CV_LOAD_IMAGE_COLOR)。r将字符串转换为“原始字符串”,不会转义特殊字符,因此您将看到一个更合理的结果。这是因为默认情况下,Python字符串接受某些特殊的“转义序列”。例如,“\n”表示换行。有关更多详细信息,请参见此处:http://docs.python.org/2/reference/lexical_analysis.html。还要查看路径是否存在。 - Black Dagger
1
导入 os 打印 os.path.exists(r'D:\testdata\some.tif')。用于查看路径是否存在。去掉 r,我敢肯定它不会工作。 - Black Dagger
14个回答

14

首先,请确保路径有效,不包含任何单个反斜杠。查看其他答案,例如https://dev59.com/OmMm5IYBdhLWcg3wBrTD#26954461

如果路径已经确定,但是图片仍然无法加载,这可能确实是一个OpenCV bug,截至2013年尚未解决。对我而言,cv2.imread在Win32下也不能正常工作。

同时,使用LoadImage应该可以正常工作。

im = cv2.cv.LoadImage("D:/testdata/some.tif", CV_LOAD_IMAGE_COLOR)

1
我怀疑这个路径会起作用。你需要加上原始前缀,如 r"D:\testdata\some.tif" - Jean-François Fabre
图像已加载,但返回类型仍为None。 - NelsonGon
1
在这个问题的背景下,@NelsonGon,这似乎是一个矛盾修辞。如果图像加载成功,你就会得到一个句柄,那么它就不可能是None。你有什么信息可以补充到这个答案吗?否则,也许可以创建一个新的问题来描述你的情况,但需要提供更多关于具体情况发生的信息。 - w-m
我可以使用 imshow 看到图像,但是我无法看到图像的 shape,因为它是 None 而不是一个数组。最后,我使用了 matplotlibimread,似乎解决了这个问题(我不知道为什么)。 - NelsonGon
1
不起作用。cv2没有名为cv的模块。 - KansaiRobot
显示剩余2条评论

10

在我的情况下,问题出在路径中的空格。当我将图像移动到没有空格的路径后,它就可以工作了。


9
我之前在ubuntu 18.04上也遇到了相同的问题。
cv2.imread(path)

当我将path参数从Relative_File_Path更改为Absolute_File_Path时,问题得到了解决。

希望这对您有用。


我不知道为什么这样行得通,但它解决了手头的问题 - undefined
我发现路径是错误的,在Jupyter中的相对路径是从ipynb文件所在的目录计算的,但如果你正在运行.py文件,则取决于你从哪里运行该命令。 - undefined

8
尝试更改斜杠的方向。
im = cv2.imread("D:/testdata/some.tif",CV_LOAD_IMAGE_COLOR)

或者在字符串的开头添加r。
im = cv2.imread(r"D:\testdata\some.tif",CV_LOAD_IMAGE_COLOR)

“尝试改变斜杠的方向”。为什么只是“尝试”?使用转义符号确实是一个错误,必须进行更正,可以采用您提到的两种解决方案之一,或者第三种方法,即使用双反斜杠而不是单反斜杠,这是专门为此设计的转义序列。 - mins

6

刚刚偶然发现了这个问题。

解决方案非常简单,但并不直观。

  • 如果您使用相对路径,则可以使用 '\' 或 '/',例如:test\pic.jpgtest/pic.jpg
  • 如果您使用绝对路径,则只应使用 '/',例如:/.../test/pic.jpg 用于Unix或 C:/.../test/pic.jpg 用于Windows
  • 为了保险起见,请使用for root, _, files in os.walk(<path>):abs_path = os.path.join(root, file)结合使用。随后调用imread,例如:img = ocv.imread(abs_path) 总是能够起作用。

在Linux上,/path/file.jpg不能正常工作,必须替换为/home/user/path/file.jpg。 - Michael Ribbons
1
点赞建议使用os.path.join - Yonatan Simson

6

如果在这个问题中没有提到,另一种解决方法是使用plt读取图像,然后将其转换为BGR格式。

img=plt.imread(img_path)
print(img.shape)
img=img[...,::-1]

cv2.imread无法读取jpg文件中提到过。


这个方法对我很有效。然而,重要的是 img=img[...,::-1] 会旋转图像。为了获得原始图像,应该使用 img=img[...,::1] - Creek

2

这个问题花费了很长时间才解决。首先确保文件在目录中,并检查即使Windows资源管理器显示该文件为“JPEG”,实际上它是“JPG”格式。第一个打印语句对于确保文件实际存在非常关键。我是一个完全的初学者,所以如果代码不好,请见谅。 这段代码仅导入一张图片并显示它。如果代码找到文件,则会在Python窗口中打印True。

import cv2
import sys
import numpy as np
import os

image_path= "C:/python27/test_image.jpg"
print os.path.exists(image_path)



CV_LOAD_IMAGE_COLOR = 1 # set flag to 1 to give colour image
CV_LOAD_IMAGE_COLOR = 0 # set flag to 0 to give a grayscale one
img = cv2.imread(image_path,CV_LOAD_IMAGE_COLOR)
print img.shape
cv2.namedWindow('Display Window') ## create window for display
cv2.imshow('Display Window', img) ## Show image in the window
cv2.waitKey(0) ## Wait for keystroke
cv2.destroyAllWindows() ## Destroy all windows

1

我遇到了类似的问题,将图片名称改为英文字母就可以了。同时,如果使用数字名称(例如1.jpg),它不起作用。


1

我的操作系统是Windows 10。我注意到imread对路径非常敏感。关于斜杠的任何建议都没有对我起作用,所以我是如何解决问题的:我将文件放在项目文件夹中并键入以下内容: img = cv2.imread("MyImageName.jpg", 0)

因此没有任何路径和文件夹,只有文件名。这对我起作用。 还可以尝试来自不同来源和不同格式的不同文件。


0
在我的情况下,更改文件名为拉丁字母表有所帮助。
我编写了一个简单的包装器,在加载到随机GUID之前重命名文件,并在加载后立即将其重命名回来,而不是重命名所有文件。
import os
import uuid
import cv2

uid = str(uuid.uuid4())


def wrap_file_rename(my_path, function):
    try:
        directory = os.path.dirname(my_path)
        new_full_name = os.path.join(directory, uid)
        os.rename(my_path, new_full_name)
        return function(new_full_name)
    except Exception as error:
        logger.error(error)  # use your logger here
    finally:
        os.rename(new_full_name, my_path)


def my_image_read(my_path, param=None):
    return wrap_file_rename(my_path, lambda p: cv2.imread(p) if param is None else cv2.imread(p, param))

1
详细说明:仅由ASCII字符组成的路径将起作用,但任何超出此范围的Unicode都可能会引起问题。 - Christoph Rackwitz
你可以使用硬链接(与符号链接相反)而不是重命名。 - Christoph Rackwitz
谢谢您的建议,有什么好处吗?它会更快地工作吗?在Windows和Linux上都可以吗? - user2809176

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接