2017-09-24 4 views
0

Je suis nouveau sur ios. Actuellement, je travaille sur une application qui utilise opencv facetracker. Par conséquent, j'utilise C++ dans Objective-C. Mon problème est que le constructeur de la classe C++, qui gère la partie de facetracking, a besoin de l'emplacement du fichier cascade. Le constructeur ressemble à ceci:ios opencv filepath du fichier de cascade

VideoFaceDetector(const std::string cascadeFilePath); 

Malheureusement, le code suivant ne fonctionne pas (filepath changé pour des raisons d'anonymat):

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

Bien que le fichier haarcascade_frontalface_default.xml est dans le projet Xcode, il ne peut pas être chargé. Existe-t-il un moyen d'obtenir le chemin de fichier du fichier cascade dans le code C++? J'ai essayé l'approche de l'utilisateur: 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); 
} 

Cela n'a pas fonctionné pour moi. Y a-t-il un autre moyen?

thx

Répondre

0

J'ai trouvé la solution. L'utilisateur r4ghu avait raison. Mais ce n'était pas clair pour moi, où mettre ces lignes de code. Si vous voulez charger votre fichier en cascade correctement, vous devez le faire avant d'initialiser votre appareil photo. Par exemple:

- (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]; 
} 

Cela a fonctionné pour moi.

bonne salutation.