OpenCV级联分类器加载错误iOS

Posted

技术标签:

【中文标题】OpenCV级联分类器加载错误iOS【英文标题】:OpenCV Cascade Classifier load error iOS 【发布时间】:2017-03-15 19:20:27 【问题描述】:

目前我正在尝试使用 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 项目中的正确方法是什么?或者,包含正确文件名以便正确看到它的正确方法是什么?

任何帮助将不胜感激。

【问题讨论】:

你试过完整路径吗? 关于如何用 C++ 做到这一点的任何想法?我找不到文件的完整路径,因为我的计算机上没有安装 OpenCV。一直在用 iPhone 测试它,所以我不需要它。 【参考方案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");

【讨论】:

感谢广的回复。目前我的代码只是普通的 C++,我包含在我的 OpenCV 包装器中。因此,我不能在我的文件中使用objective-c 代码。还有其他建议吗? 您可以混合使用 C++ 和 Objective-C++,只要将文件命名为 .mm(或指定源代码类型为 Objective-C++)。

以上是关于OpenCV级联分类器加载错误iOS的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV3.1.0级联分类器训练与使用

如何利用OpenCV自带的级联分类器训练程序训练分类器

在使用opencv中ClassifierCascade类时,无法加载级联分类器,相对路径和绝对路径都无法加载成功,why??

OpenCV 级联分类器训练模型

opencv5-objdetect之级联分类器

OpenCV中的Haar级联分类器数据: