python:OpenCV根目录

2024-04-25 07:51:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用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(检索时间:13年3月5日)


Tags: 代码文档imagedefault示例loadxmlopencv
3条回答

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

from os.path import realpath, normpath
normpath(realpath(cv2.__file__) + '../../../../../share/OpenCV/haarcascades')

check this link

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

似乎没有希望有一个单一的机制可以跨时间和空间(版本和平台/环境)进行移植,但有一些进展-我不知道哪个版本引入了它,但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'))

相关问题 更多 >