2017-01-31 167 views
1

我是C++類的初學者,使用dlib人臉檢測器。在與網絡攝像頭使用的示例代碼中,人臉檢測和姿勢模型加載到主函數中是這樣的:全局初始化C++類

int main(){ 
    frontal_face_detector detector = get_frontal_face_detector(); 
    shape_predictor pose_model; 
    deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; 

}

然而,我的項目的方式構成的,DLIB臉檢測如示例中所示,通過另一個函數調用而不是main函數。因此,我需要使模型全局化,以便執行dlib的函數知道「探測器」和「pose_model」是什麼,而不必將其作爲參數傳遞給該函數。無論如何要這樣做?如果我在函數內部加載模型,那麼每次調用函數時都會加載模型,從而降低性能。

static dlib :: frontal_face_detector檢測器; static dlib :: shape_predictor pose_model;

目前我正在使用'靜態'來加載它們內部的函數本身,但我不知道如果這是正確的C++?對於這個問題的奇怪格式抱歉,因爲這是我在這個論壇上的第一個問題。感謝您的理解和幫助! 謝謝

+0

靜態函數的外部。如果在多個文件中,則將該變量重新聲明爲「extern」。您也可以在所有其他源文件包含的標題中執行此操作。來源:http://www.learncpp.com/cpp-tutorial/42-global-variables/ – namar0x0309

+0

是的,你的用法是正確的:一個函數內部的靜態限制了範圍(只有函數可以看到它),只有一個每個程序運行的實例化,並且實例化將在第一次調用該函數時發生。但是,如果您有線程化程序,則需要互斥鎖。如果這些限制不能阻止你遵循你的規範,那麼在函數中使用靜態是很好的。 – kfmfe04

+0

謝謝kfmfe04。這有助於。 – Ampa08

回答

1

當你像其他全局變量一樣初始化它們時,你可以簡單地聲明它們。

frontal_face_detector detector = get_frontal_face_detector(); 
shape_predictor pose_model; 

int main(){ 

     deserialize("shape_predictor_68_face_landmarks.dat") >> pose_model; 
     ... 
}