将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标

Posted

技术标签:

【中文标题】将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标【英文标题】:Convert Vision face detection VNFaceLandmarkRegion2D points into frame coordinates to be scale 【发布时间】:2019-07-14 07:01:41 【问题描述】:

我正在使用视觉框架来检测面部标志,它工作正常,但我需要转换面部标志,如鼻子、眼睛,为此我需要获取帧坐标中的鼻子、眼睛位置,因为面部标志正在使用 VNFaceLandmarkRegion2D 绘制点。

请告诉我如何将 VNFaceLandmarkRegion2D 点转换为框架坐标。因此,我可以获取要转换的位置或建议任何其他方式来转换面部地标。

【问题讨论】:

【参考方案1】:

Joshua Newnham 的这段代码解决了您的问题。

 func getTransformedPoints(
                landmark:VNFaceLandmarkRegion2D,
                faceRect:CGRect,
                imageSize:CGSize) -> [CGPoint]

                // last point is 0.0
                return landmark.normalizedPoints.map( (np) -> CGPoint in
                    return CGPoint(
                        x: faceRect.origin.x + np.x * faceRect.size.width,
                        y: imageSize.height - (np.y * faceRect.size.height + faceRect.origin.y))
                )
            

【讨论】:

我在 y 位置上苦苦挣扎,这解决了我的问题。谢谢@Ozgur【参考方案2】:

作为一个新手,这是我可以找到的将面部标记作为 CGPoint 的方法:

    先将选中的图片转换成CIImage 在图像上使用 faceDetector 为每个人脸解析图像,以防它有多个人脸

代码:

let chosenPicture = CIImage(data: (self.selectedimage.image?.tiffRepresentation)!)
let selectedFace = faceDetector?.features(in: chosenPicture!, options: [CIDetectorSmile:true])
for person in selectedFace as! [CIFaceFeature] 
    let p1LeftEye = person.leftEyePosition
    let p1RightEye = person.rightEyePosition
    let p1Mouth = person.mouthPosition

【讨论】:

感谢您的回复。我想使用视觉框架而不是 CIDetector 定位

以上是关于将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标的主要内容,如果未能解决你的问题,请参考以下文章

将Vision人脸检测VNFaceLandmarkRegion2D点转换为要缩放的帧坐标

使用“android-vision”库保存实时检测到的人脸(跟踪人脸)图像

CoreML Vision 人脸检测的输入图像尺寸要求是啥

使用 Vision 框架跟踪本地视频中的人脸 [关闭]

android mobile vision api自定义检测器未检测到人脸

Java - 带有轮廓的 Android Mobile Vision 人脸检测