Проверьте, находится ли рамка лица внутри маски наложения - PullRequest
0 голосов
/ 19 октября 2019

В моем приложении я делаю распознавание лица с помощью GoogleKase FireBase MLKit, и он обнаруживает лицо на мобильном телефоне, который работает нормально. Теперь я добавил наложение маски для лица, и мне нужно проверить, соответствует ли мое лицо наложению маски. Ниже приведен мой текущий расчет, он работает до некоторой степени, но он не полностью идеален, иногда он показывает идеальное сообщение, даже когда он выходит за границы, а иногда он показывает ошибку, даже когда лицо подходит. Я думаю, что я мог бы пропустить некоторые расчеты или пропорции. Ниже приведен мой код. Наложенная рамка маски моего лица постоянна, и это то, что я получаю в журнале: x = 45, y = 141, width = 286, height = 322 и моя рамка лица зависит от разных лиц и от того, насколько близко вы находитесь к камере, но она всегда равна square

func checkIfFaceFits(_ face: VisionFace){
            let frame = face.frame
            let widthDiff = frame.width - faceMaskOverlayView.frame.width
            let heightDiff = faceMaskOverlayView.frame.height - frame.height
            let faceHeightDiff = frame.height - faceMaskOverlayView.frame.height
            let faceWidthDiff = frame.width - faceMaskOverlayView.frame.width
            let widthThreshold: CGFloat = 50.0
            let heightThreshold: CGFloat = 120.0
            if ((widthDiff > widthThreshold) && (heightDiff < heightThreshold)) {
                if let noseBridge = face.contour(ofType: .noseBridge) {
                    if let lowerNoseBridge = noseBridge.points.last, (Int(faceMaskOverlayView.center.x) - Int(truncating: lowerNoseBridge.y)) > 100 || (Int(faceMaskOverlayView.center.y) - Int(truncating: lowerNoseBridge.x)) > 100 {
                        updateFaceMaskColorAndLabel(msg: "Come to center", color: .red)
                    }  else {
                        if ((faceWidthDiff > widthThreshold) && (faceHeightDiff > heightThreshold)) {
                            updateFaceMaskColorAndLabel(msg: "Too close", color: .red)
                        } else {
                            updateFaceMaskColorAndLabel(msg: "Face adjusted, perfect!", color: .green)
                        }
                    }
                }
            } else if ((widthDiff < widthThreshold) && (heightDiff > heightThreshold)) {
                updateFaceMaskColorAndLabel(msg: "Too far", color: .red)
            } else {
                updateFaceMaskColorAndLabel(msg: "Too far", color: .red)
            }
    }

По сути, все, что мне нужно, это проверить, подходит ли моя рамка лица внутрь данного кадра в пределах определенного порога к центральной точке. Может быть, есть простой расчет, я могу быть слишком сложным. Любая помощь приветствуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...