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



我对python和opencv世界非常陌生。我只是想阅读并显示一张图片,但我总是收到一个错误:

错误:D: \Build\OpenCV\OpenCV-3.10\modules\highgui \src\window.cpp:289:错误:(-215)size.width>0&函数cv::imshow 中的size.height>0

我创建了一个名为test.py的模块。在该模块中,我尝试读取系统路径中的图像"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中有文件名,那么您应该打开的文件将是

os.path.join(dir, filename)

所以你应该试试

im = cv2.imread(os.path.join(dir, filename))

那些对用Python包发送数据文件感兴趣的人可能会做得比查看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;
}

相关内容

  • 没有找到相关文章

最新更新