繁体   English   中英

从Python模块内sys.path中的路径读取图像

[英]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.pathPython文档中说它是

字符串列表,指定模块的搜索路径

基本上, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM