[英]Read image from a path in sys.path inside a Python module
我对python和opencv世界很陌生。 我只是尝试阅读并显示图像,但总是收到错误消息:
错误:D:\\ Build \\ OpenCV \\ opencv-3.1.0 \\ modules \\ highgui \\ src \\ window.cpp:289:错误:(-215)size.width> 0 && size.height> 0在函数cv :: imshow中
我创建了一个名为test.py的模块。 在该模块中,我尝试读取系统路径“ C:\\ cv \\ images”中的图像“ car.png” ,并将其显示如下:
import cv2;
import sys;
sys.path.append('C:\\cv\\images');
im = cv2.imread('car.png');
cv2.imshow('Car Figure',im);
cv2.waitKey(0);
当我调试代码时,我可以看到im变量从未初始化,这就是为什么我得到该错误代码的原因。 但是,当我在解释器中键入sys.path时,它表明该路径已经被添加了很多次,我试图运行我的模块。 当我直接在解释器中复制/粘贴模块内容时,代码可以正常工作并显示图像。
似乎在模块内部,未考虑sys.path,并且python无法读取图像。
您是否知道这是正常现象,还是应该在模块内部做一些事情,让解释器读取sys.path内容?
是什么让您想象sys.path
设置会影响您从中读取文件的目录? 它仅用于查找要导入的Python模块。 因此,要回答您的问题,您所看到的行为是正常且预期的。 如果您在dir
有一个目录,在filename中有一个文件filename
那么您应该打开的文件将是
os.path.join(dir, filename)
所以你应该尝试
im = cv2.imread(os.path.join(dir, filename))
那些对使用Python软件包运送数据文件感兴趣的人,可能比看pkgutil
软件包的文档pkgutil
。 特别是pkgutil.get_data
对于在安装过程中放置数据文件的地方查找数据文件很有用。
我不确定您要在应用程序中做什么,但是sys.path
在示例代码中似乎是多余的。 此外, sys.path
在Python文档中说它是
字符串列表,指定模块的搜索路径
基本上, sys.path
用于加载模块本身,而不是模块内部的文件。
该变量永远不会初始化,因为它没有加载图像。 此变通办法会蛮力地压缩sys.path
直到加载文件,该方法可正常工作,但不是优雅,常规或必要的:
import sys
import cv2
sys.path.append('C:\\users\\xxxx\\pictures\\')
loaded = False
for rel in sys.path:
im = cv2.imread(rel+'image.jpg')
if im is not None:
loaded = True
cv2.imshow('Car Figure',im)
cv2.waitKey(0)
if loaded == False:
raise Exception('Couldn\'t load image')
在查看了您所使用的Open CV版本的源代码和内部加载函数之后 ,似乎imread
函数并未考虑sys.path
:
Mat imread( const String& filename, int flags )
{
/// create the basic container
Mat img;
/// load the data
imread_( filename, flags, LOAD_MAT, &img );
/// return a reference to the data
return img;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.