6

我将 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(检索 3/5/13)

4

5 回答 5

7

您可以使用cv2.__file__获取模块的路径,然后使用 os.path 来解析符号链接并进行一些路径操作。这行代码返回我的 Mac OS homebrew 安装上的 haarcascades 文件的目录。它也可能适用于其他安装。

from os.path import realpath, normpath
normpath(realpath(cv2.__file__) + '../../../../../share/OpenCV/haarcascades')
于 2014-08-01T12:50:33.137 回答
2

似乎几乎没有希望拥有一种跨时间和空间(版本和平台/环境)可移植的单一机制,但有一些进展 - 我不知道哪个版本引入了它,但 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'))
于 2019-05-21T04:55:38.210 回答
-1

检查这个链接

您可以使用 sys.platform 来确定平台并根据 sys.platform 的返回设置不同的默认路径

于 2013-03-05T15:47:31.480 回答
-1

我在同一条船上,这是一条烦人的船。

您可以用来处理此类可移植性问题的一种约定是使用配置文件。在您的情况下,您可能有一个 file ~/.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 路径创建配置文件,他们就会收到一条明确的错误消息告诉他们这样做。

于 2016-08-26T10:03:06.037 回答
-2

为什么不直接将包含 xml 文件的文件夹复制到本地工作区文件夹并使用相对路径?我记得,它不会在您的硬盘驱动器上占用太多空间

于 2013-03-05T15:51:39.937 回答