Вывести неправильное положение глаз с помощью CIfacefeature и SquareCam

Я пытаюсь написать код, который наносит наклейку на глаза, а код основан на SquareCam.

Он хорошо распознает лица, но когда я пытался вывести свое изображение на левый глаз, он всегда дает неправильное положение, хотя я использовал одни и те же способы при поиске прямоугольника лица.

На моем телефоне есть результаты.

Задняя камера Результат

Фронтальная камера Результат

И код здесь.

  for ff in features as! [CIFaceFeature] {
        // find the correct position for the square layer within the previewLayer
        // the feature box originates in the bottom left of the video frame.
        // (Bottom right if mirroring is turned on)
        var faceRect = ff.bounds

        let temp = faceRect.origin.x
        faceRect.origin.x = faceRect.origin.y
        faceRect.origin.y = temp
        // scale coordinates so they fit in the preview box, which may be scaled
        let widthScaleBy = previewBox.size.width / clap.size.height
        let heightScaleBy = previewBox.size.height / clap.size.width
        faceRect.size.width *= widthScaleBy
        faceRect.size.height *= heightScaleBy
        faceRect.origin.x *= widthScaleBy
        faceRect.origin.y *= heightScaleBy

        var eyeRect : CGRect
        eyeRect = CGRect()
        eyeRect.origin.x = ff.leftEyePosition.y
        eyeRect.origin.y = ff.leftEyePosition.x
        eyeRect.origin.x *= widthScaleBy
        eyeRect.origin.y *= heightScaleBy


        eyeRect.size.width = faceRect.size.width * 0.15
        eyeRect.size.height = eyeRect.size.width


        if isMirrored {
            faceRect = faceRect.offsetBy(dx: previewBox.origin.x + previewBox.size.width - faceRect.size.width - (faceRect.origin.x * 2), dy: previewBox.origin.y)
            eyeRect = eyeRect.offsetBy(dx:previewBox.origin.x + previewBox.size.width - eyeRect.size.width - (eyeRect.origin.x * 2),dy : previewBox.origin.y)

        } else {
            faceRect = faceRect.offsetBy(dx: previewBox.origin.x, dy: previewBox.origin.y)
            eyeRect = eyeRect.offsetBy(dx: previewBox.origin.x, dy:previewBox.origin.y)

        }

        print(eyeRect)
        print(faceRect)

        var featureLayer: CALayer? = nil
        var eyeLayer : CALayer? = nil
        // re-use an existing layer if possible
        while featureLayer == nil && (currentSublayer < sublayersCount) {
            let currentLayer = sublayers[currentSublayer];currentSublayer += 1
            if currentLayer.name == "FaceLayer" {
                featureLayer = currentLayer
                currentLayer.isHidden = false
                eyeLayer = featureLayer?.sublayers?[0]
                //eyeLayer?.isHidden = false
            }
        }

        // create a new one if necessary
        if featureLayer == nil {
            featureLayer = CALayer()
            featureLayer!.contents = square.cgImage
            featureLayer!.name = "FaceLayer"
            previewLayer?.addSublayer(featureLayer!)

            eyeLayer = CALayer()
            eyeLayer!.contents = eyes.cgImage
            eyeLayer!.name = "EyeLayer"
            featureLayer?.addSublayer(eyeLayer!)
        }


        featureLayer!.frame = faceRect
        eyeLayer!.frame = eyeRect

1 ответ

0,0 в левом нижнем углу для eyePositions, поэтому вы должны eyePosition.y = image.size.height - eyePosition.y быть в той же системе координат, что и кадры.

Другие вопросы по тегам