gpt4 book ai didi

ios - 当头部滚动角度不在 -30 到 30 度之间时,dlib 68 个面部标志点不准确

转载 作者:行者123 更新时间:2023-11-29 05:47:45 26 4
gpt4 key购买 nike

我正在尝试使用 dlib 检测面部并从 iPhone 相机(BGRA 格式)中提取面部标志。

到目前为止,我已经做到了从 AVMetaData 中检测人脸矩形,并在图像上的这些边界内绘制 68 个 dlib 地标。当检测到的头部的滚动角度(滚动角度数据也从 AVMetadata 中提取)大约在 -30 到 30 度之间时,一切正常。然而,如果检测到的头部转动超过 30 度,面部标志就根本无法正确对齐。这 68 个点将不再沿着头部旋转,也就是说我将 iPhone 置于横向模式,主页按钮位于左侧,前置摄像头打开,68 个绘制点的脸部保持正面。

我已经使用 openGL(离屏渲染)和 openCV 测试了渲染视频图像,它们都生成相同的结果。渲染方法似乎与我的问题无关。

我的问题是

  1. 如何正确对齐 dlib 生成的 68 个点,尽管有头部滚动角度?
  2. 或者,dlib 是否有可能准确检测任何翻转超过 30 度的面部?

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

最佳答案

老实说,第一个问题我不太清楚。

关于第二个,根据我过去项目的经验。我们可以通过两个眼睛中心之间的连线来检测脸部是正面还是倾斜。如果这条线是倾斜的,我们可以说脸部需要对齐。更多详细信息可以在下面的链接中找到,您可以在其中找到非常清晰的步骤和步骤 Face alignment

关于ios - 当头部滚动角度不在 -30 到 30 度之间时,dlib 68 个面部标志点不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55980828/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com