dlib 68 cara hito puntos son inexactos cuando la cabeza del rollo de ángulo NO es entre -30 a 30 grados
Estoy tratando de detectar caras y extraer facial monumentos de la cámara del iphone(BGRA-formato) utilizando dlib.
Hasta el momento, lo hice para detectar la cara rects de AVMetaData y dibujar 68 dlib puntos de referencia dentro de los límites de la imagen. Cuando se detecta en la cabeza del rollo de ángulo (roll-ángulo de datos se extraen de AVMetadata así) es approxiamtely entre -30 a 30 grados, todo funciona bien. Sin embargo, si la detecta cabeza rollos de más de 30 grados, el facial monumentos no se alinean correctamente en todos. Los 68 puntos dejaría de girar a lo largo de la cabeza, diciendo que me voy a celebrar mi iphone en orientación horizontal en el modo con el botón de inicio en la izquierda y la cámara frontal, el 68-dibujado-puntos de cara estancias frontal.
He probado con openGL(fuera de la pantalla de presentación) y openCV para la representación de imágenes de vídeo, todos ellos generan los mismos resultados. La representación de enfoque parece irrelavant a mi problema.
Mis preguntas son
- ¿Cómo puedo alinear correctamente los dlib generado 68 puntos, a pesar de la cabeza rollo de ángulo?
- O, si es posible para dlib para detectar con precisión ninguna de las caras que los rollos de más de 30 grados?
- (NSMutableArray <NSMutableArray <NSValue *> *>*)detecitonOnSampleBuffer:(CMSampleBufferRef)sampleBuffer inRects:(NSArray<NSValue *> *)rects {
dlib::array2d<dlib::bgr_pixel> img;
dlib::array2d<dlib::bgr_pixel> img_gray;
// MARK: magic
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
CVPixelBufferLockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
char *baseBuffer = (char *)CVPixelBufferGetBaseAddress(imageBuffer);
// set_size expects rows, cols format
img.set_size(height, width);
// copy samplebuffer image data into dlib image format
img.reset();
long position = 0;
while (img.move_next()) {
dlib::bgr_pixel& pixel = img.element();
// assuming bgra format here
long bufferLocation = position * 4; //(row * width + column) * 4;
char b = baseBuffer[bufferLocation];
char g = baseBuffer[bufferLocation + 1];
char r = baseBuffer[bufferLocation + 2];
dlib::bgr_pixel newpixel(b, g, r);
pixel = newpixel;
position++;
}
// unlock buffer again until we need it again
CVPixelBufferUnlockBaseAddress(imageBuffer, kCVPixelBufferLock_ReadOnly);
// convert the face bounds list to dlib format
std::vector<dlib::rectangle> convertedRectangles = [self convertCGRectValueArray:rects bound:CGSizeMake(height, width)];
dlib::assign_image(img_gray, img);
NSMutableArray *facesLandmarks = [NSMutableArray arrayWithCapacity:0];
for (unsigned long j = 0; j < convertedRectangles.size(); ++j) {
/* original codes start from here */
dlib::rectangle oneFaceRect = convertedRectangles[j];
// detect all landmarks
dlib::full_object_detection shape = predictor(img, oneFaceRect);
NSMutableArray *eachFaceLandmarks = [NSMutableArray arrayWithCapacity:0];
for (int i = 0; i < shape.num_parts(); i++) {
dlib::point p = shape.part(i);
[eachFaceLandmarks addObject:[NSValue valueWithCGPoint:CGPointMake(p.x(), p.y())]];
}
//
[facesLandmarks addObject:eachFaceLandmarks];
}
return facesLandmarks;
}