2017-09-24 74 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]; 
} 

這對我有效。

不錯的問候。