2016-11-25 3 views
1

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

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

Результаты на моем телефоне.

Back Camera Result

Front Camera Result

И код здесь.

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 
+0

Я написал [demo] (https://github.com/kudocc/CCKit/blob/master/CCKitDemo/coreImage/FaceDetectorViewController.m) с объективом-c, надеюсь, что это поможет. – KudoCC

+0

У меня такая же проблема. Вы нашли решение? –

ответ

0

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