2017-09-24 61 views
0

我是新来的ios。目前我正在使用一个使用opencv facetracker的应用程序。因此我在Objective-C中使用C++。我的问题是,处理facetracking部分的C++类的构造器需要级联文件的文件位置。构造函数看起来是这样的:ios opencv级联文件的路径

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); 
} 

它没有为我工作。 还有别的办法吗?

thx

回答

0

我找到了解决方案。用户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]; 
} 

这对我有效。

不错的问候。