2013-03-05 176 views
2

我使用OpenCV的各種對象檢測器,我發現很難寫便攜式代碼。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")) 

UPDATE:它看起來像這不只是對我一個問題;這對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日)

+0

關於你的更新:它沒有壞;)這是因爲該文檔的作者正在opencv文件夾中運行python示例,所以他也使用相對路徑。這讓我回憶起3年前的一些回憶,我也對後面的相對位置感到困惑:) – 2013-03-05 16:24:01

+0

如果我不能在解釋器的文檔中運行代碼,那麼它就會被破壞。 – 2013-03-05 17:49:27

回答

2

成本多少空間可以使用cv2.__file__去的模塊路徑,然後使用os.path中解決符號鏈接,並做一些路徑處理。這行代碼返回Mac OS自制軟件安裝中haarcascades文件的目錄。它也可能適用於其他安裝。

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

check this link

您可以使用sys.platform確定平臺,並設置根據從sys.platform

返回不同的默認路徑
+0

我不認爲這會起作用。例如,在OS X上,OpenCV根目錄的安裝位置*非常*異構 - 它可以位於/ usr/local/share(homebrew),/ sw/share(fink),/ opt/local/share(macports )。在linux上,通常在/ usr/share中,除了可能位於/ usr/local/share的自定義安裝。如果用戶沒有root,那麼他們可能會將其安裝在他們的主目錄中。不幸的是,sys.platform開關並沒有真正處理這個廢話:( – 2013-03-05 15:53:43

-1

爲什麼不只是將包含xml文件的文件夾複製到本地工作區文件夾並使用相對路徑?我記得,它並沒有你的硬盤

+1

雖然這比我的絕對路徑解決方案稍好一點,但它仍然非常難看,每當我想使用其他一些可裝載的opencv中的分類器 - 作爲opencv推出的修訂版,我將不得不繼續複製以保持最新。 – 2013-03-05 16:00:08

-1

我在同一條船上,它是一條煩人的船。

您可以用來處理這種可移植性問題的一個慣例是使用配置文件。在你的情況,你可以有一個文件~/.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路徑創建配置文件,並且他們會收到明確的錯誤消息,告訴他們這樣做。