繁体   English   中英

python:OpenCV根目录

[英]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.

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