2017-03-15 85 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++。 –