目前我正在尝试使用OpenCV级联分类器来检测iOS应用中的面部。问题是,当我去加载分类器时,它会失败,因为" haarcascade_frontalface_alt.xml"不正确。
这是我的代码:
cv::String face_cascade_name = "haarcascade_frontalface_alt.xml";
void detectFaces(cv :: Mat frame){
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文件的路径。将级联分类器加载到iOS项目的正确方法是什么?或者,包含正确的文件名以便正确看到它的正确方法是什么?
任何帮助都将不胜感激。
答案 0 :(得分: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");
}