1

我正在尝试编写在眼睛上贴上贴纸的代码,该代码基于 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
4

1 回答 1

0

0,0 位于 eyePositions 的左下角,因此您必须eyePosition.y = image.size.height - eyePosition.y与框架处于相同的坐标系中。

于 2018-02-23T22:29:12.687 回答