我对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;
}