ios 级联文件的opencv文件路径

ios opencv filepath of cascade file

我是 ios 的新手。目前我正在开发一个使用 opencv facetracker 的应用程序。 因此我在 Objective-C 内使用 C++。我的问题是,处理面部跟踪部分的 C++ class 的构造函数需要级联文件的文件位置。构造函数如下所示:

VideoFaceDetector(const std::string cascadeFilePath);

不幸的是,以下代码不起作用(由于匿名原因更改了文件路径):

const cv::String    CASCADE_FILE("/../../../../haarcascade_frontalface_default.xml");

虽然 haarcascade_frontalface_default.xml 文件在 Xcode 项目中,但无法加载。 有没有办法在 C++ 代码中获取级联文件的文件路径?我已经尝试过用户的方法:r4ghu

NSString *faceCascadePath = [[NSBundle mainBundle]
                             pathForResource:@"<your_cascade_name>"
                             ofType:@"xml"];
const CFIndex CASCADE_NAME_LEN = 2048;
char *CASCADE_NAME = (char *) malloc(CASCADE_NAME_LEN);
CFStringGetFileSystemRepresentation( (CFStringRef)faceCascadePath,
                                    CASCADE_NAME,
                                    CASCADE_NAME_LEN);
if(!face_cascade.load(CASCADE_NAME)) {
    cout << "Unable to load the face detector!!!!" << endl;
    exit(-1);
}

它对我不起作用。 还有别的办法吗?

谢谢

我找到了解决办法。用户 r4ghu 是对的。但我不清楚将那几行代码放在哪里。如果您想正确加载级联文件,则必须在初始化相机之前执行此操作。例如:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSString * const TFCascadeFilename = @"haarcascade_frontalface_alt2";//Strings of haar file names

    NSString *TF_cascade_name = [[NSBundle mainBundle] pathForResource:TFCascadeFilename ofType:@"xml"];

    bool check = false;
    //Load haar file, return error message if fail
    if (!(check = faceCascade.load( [TF_cascade_name UTF8String] ))) {
        NSLog(@"[Cascade File]: Could not load TF cascade!");
    }
    else{
        NSLog(@"[Cascade File]: Successfully loaded!");
    }
    NSLog(@"[path]: %@\n", TF_cascade_name);


    self.videoCamera = [[CvVideoCamera alloc] initWithParentView:imageView];
    self.videoCamera.defaultAVCaptureDevicePosition = AVCaptureDevicePositionFront;
    self.videoCamera.defaultAVCaptureSessionPreset = AVCaptureSessionPresetHigh;
    self.videoCamera.defaultAVCaptureVideoOrientation = AVCaptureVideoOrientationPortrait;
    self.videoCamera.defaultFPS = 30;
    self.videoCamera.grayscaleMode = NO;
    self.videoCamera.delegate = self;
    self.videoCamera.rotateVideo = YES;
    [self.videoCamera start];
}

这对我有用。

亲切的问候。