2017-03-15 88 views
0

目前我正在嘗試使用OpenCV級聯分類器來檢測iOS應用中的面孔。問題是,當我去加載分類器時,它會失敗,因爲「haarcascade_frontalface_alt.xml」的路徑名不正確。OpenCV級聯分類器加載錯誤iOS

這裏是我的代碼:

cv::String face_cascade_name = "haarcascade_frontalface_alt.xml"; 

無效detectFaces(CV ::墊邊){

cv::CascadeClassifier face_cascade; 
if (face_cascade.load(face_cascade_name)){ 
    printf("Load complete"); 
}else{ 
    printf("Load error"); 
} 
std::vector<cv::Rect> faces; 

std::vector<cv::Mat> rgbChannels(3); 
cv::split(frame, rgbChannels); // Making the frame gray scale 
cv::Mat frame_gray = rgbChannels[2]; 

face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE|CV_HAAR_FIND_BIGGEST_OBJECT, cv::Size(150,150)); 

if(faces.size()> 0){ 
    printf("TRUE"); 
} 

}

由於這是一個iOS的項目,我不知道如何在框架中查找所需的xml文件的路徑。將Cascade Classifier加載到iOS項目中的正確方法是什麼?或者,包含正確的文件名以便正確看到它的正確方法是什麼?

任何幫助,將不勝感激。

+0

您是否嘗試過使用完整路徑? – Miki

+0

關於如何用C++做到這一點的任何想法?我無法找到文件的完整路徑,因爲我的電腦上沒有安裝OpenCV。一直在用iPhone測試它,所以我不需要它。 – NFarrell

回答

1

在iOS中,您需要在app bunnle中找到文件路徑。類似這樣的:

// get main app bundle 
NSBundle * appBundle = [NSBundle mainBundle]; 

// constant file name 
NSString * cascadeName = @"haarcascade_frontalface_alt"; 
NSString * cascadeType = @"xml"; 

// get file path in bundle 
NSString * cascadePathInBundle = [appBundle pathForResource: cascadeName ofType: cascadeType]; 

// convert NSString to std::string 
std::string cascadePath([cascadePathInBundle UTF8String]); 

// load cascade 
if (face_cascade.load(cascadePath)){ 
    printf("Load complete"); 
}else{ 
    printf("Load error"); 
} 
+0

感謝Quang的迴應。目前我的代碼只是在我的OpenCV包裝器中包含的常規C++中。所以我不能在我的文件中使用Objective-C代碼。還有其他建議嗎? – NFarrell

+0

只要命名文件'.mm'(或將源代碼類型指定爲Objective-C++),就可以混合使用C++和Objective-C++。 –