[英]python: OpenCV Root Directory
我正在使用OpenCV用于各种对象检测器,我发现编写可移植代码很困难。
例如,要加载面部检测器,在通过自制软件安装OpenCV的Mac上,我必须写:
haar=cv.Load('/usr/local/Cellar/opencv/2.4.2/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml')
这不便携; 如果我想换到另一台机器,我将不得不确定另一个绝对路径并更改此代码。
是否有一个变量来保存OpenCV的OpenCV根目录? 这样我就可以这样写:
haar=cv.Load(os.path.join(OpenCVRoot, "haarcascades",
"haarcascade_frontalface_default.xml"))
更新 :看起来这对我来说不仅仅是一个问题; 这也是OpenCV文档的一个问题。 该文档包含以下破坏的示例代码:
>>> import cv
>>> image = cv.LoadImageM("lena.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
>>> cascade = cv.Load("../../data/haarcascades/haarcascade_frontalface_alt.xml")
>>> print cv.HaarDetectObjects(image, cascade, cv.CreateMemStorage(0), 1.2, 2, 0, (20, 20))
[((217, 203, 169, 169), 24)]
如果有一种方法可以推断出安装lena.jpg和预训练分类器等示例的方法,这将很容易避免。
资料来源: http : //opencv.willowgarage.com/documentation/python/objdetect_cascade_classification.html (2013年3月5日检索)
您可以使用cv2.__file__
获取模块的路径,然后使用os.path来解析符号链接并执行一些路径操作。 这行代码返回我的Mac OS自制软件安装中的haarcascades文件的目录。 它也可以用于其他安装。
from os.path import realpath, normpath
normpath(realpath(cv2.__file__) + '../../../../../share/OpenCV/haarcascades')
似乎没有希望拥有一个可以在时间和空间(版本和平台/环境)上移植的单一机制,但是有一些进展 - 我不知道哪个版本引入了它,但4.0有它:
cv2.data.haarcascades
- 指向目录的字符串,例如:
>>> import cv2
>>> cv2.data
<module 'cv2.data' from 'C:\\Users\\USERNAME\\Anaconda3\\envs\\py36\\lib\\site-packages\\cv2\\data\\__init__.py'>
>>> cv2.data.haarcascades
'C:\\Users\\USERNAME\\Anaconda3\\envs\\py36\\lib\\site-packages\\cv2\\data\\'
>>> cv2.__version__
'4.0.0'
但不幸的是,对于3.2.x和3.4.x,没有这样的模块......
所以你可以这样做:
if hasattr(cv2, 'data'):
print('Cascades are here:', cv2.data.haarcascades)
else:
print('This may not work:')
print(normpath(realpath(cv2.__file__) + '../../../../../share/OpenCV/haarcascades'))
您可以使用sys.platform来确定平台,并根据sys.platform的返回值设置不同的默认路径
为什么不将包含xml文件的文件夹复制到本地工作区文件夹并使用相对路径? 我记得,它的硬盘空间不会太大
我在同一条船上,这是一条恼人的船。
您可以用来处理此类可移植性问题的一个约定是使用配置文件。 在你的情况下,你可以有一个文件~/.myprojectrc
,它可以包含:
[cv]
cvroot = '/usr/local/Cellar/opencv/2.4.2/share/OpenCV/`
ConfigParser对象可以读取此格式的文件,其类似于:
import ConfigParser
import os
CONFIG = ConfigParser.ConfigParser()
config_path = os.path.join(os.path.expanduser('~'), '.myprojectrc')
if not os.path.exists(config_path):
raise Exception('You need to make a "~/.myprojectrc" file with your cv path or something')
CONFIG.read(config_path)
...
cv_root = CONFIG.get('cv', 'cvroot')
然后,至少当有人在另一台机器上使用代码时,他们不必修改任何代码,他们只需要使用opencv路径创建配置文件,并且他们会收到明确的错误消息,告诉他们这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.