Я играю с iOS 11vision Framework, чтобы обнаружить особенности лица, такие как нос, глаза, губы и т. Д. Теперь я пытаюсь нарисовать красную линию над правым глазом с помощью пути Безера, и ниже приведен код, который я использую для рисования. Контекст создается и используется для рисования линейной линии. < /p>
2) AddNewPathtoImage () < /code> Метод определяется для добавления Shapelayer в обнаруженный правый глаз, чтобы я мог обрезать это в следующей форме. < /p>
func addFaceLandmarksToImage(_ face: VNFaceObservation) {
UIGraphicsBeginImageContextWithOptions(image.size, false, 1.0)
let context = UIGraphicsGetCurrentContext()
image.draw(in: CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height))
context?.translateBy(x: 0, y: image.size.height)
context?.scaleBy(x: 1.0, y: -1.0)
// draw the face rect
let w = face.boundingBox.size.width * image.size.width
let imgViewWidth = face.boundingBox.size.width * imageView.frame.size.width
let h = face.boundingBox.size.height * image.size.height
let imgViewHeight = face.boundingBox.size.height * imageView.frame.size.height
let x = face.boundingBox.origin.x * image.size.width
let imgViewX = face.boundingBox.origin.x * imageView.frame.size.width
let y = face.boundingBox.origin.y * image.size.height
let imgViewY = face.boundingBox.origin.y * imageView.frame.size.height
let faceRect = CGRect(x: x, y: y, width: w, height: h)
context?.saveGState()
context?.setStrokeColor(UIColor.red.cgColor)
context?.setLineWidth(5.0)
context?.addRect(faceRect)
context?.drawPath(using: .stroke)
context?.restoreGState()
// right eye
context?.saveGState()
context?.setStrokeColor(UIColor.red.cgColor)
if let landmark = face.landmarks?.rightEye {
for i in 0...landmark.pointCount - 1 {
let point = landmark.normalizedPoints
if i == 0 {
eyePath.move(to: CGPoint(x: imgViewX + CGFloat(point.x) * imgViewWidth, y: imgViewY + CGFloat(point.y) * imgViewHeight))
context?.move(to: CGPoint(x: x + CGFloat(point.x) * w, y: y + CGFloat(point.y) * h))
} else {
eyePath.addLine(to: CGPoint(x: imgViewX + CGFloat(point.x) * imgViewWidth, y: imgViewY + CGFloat(point.y) * imgViewHeight))
context?.addLine(to: CGPoint(x: x + CGFloat(point.x) * w, y: y + CGFloat(point.y) * h))
addNewPathToImage(path: eyePath)
}
}
}
addNewPathToImage(path: eyePath)
eyePath.close()
context?.closePath()
context?.setLineWidth(2.0)
context?.drawPath(using: .stroke)
context?.saveGState()
let finalImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
imageView.image = finalImage
}
func addNewPathToImage(path: UIBezierPath){
shapeLayer.path = path.cgPath
shapeLayer.strokeColor = UIColor.blue.cgColor
shapeLayer.fillColor = UIColor.red.cgColor
shapeLayer.lineWidth = 1.0
imageView.layer.addSublayer(shapeLayer)
}
< /code>
< /p>
Теперь, как вы можете видеть, я могу точно нарисовать правый глаз через текущий контекст на ImageView. Я уже применил свойство «Перевести и масштабировать в своем контексте». Я знаю, что uikit использует ulo (верхнее левое происхождение), а основная графика основана на системе llo (левое левое левое). < /p>
Какое преобразование мне нужно применить в этом процессе, чтобы разместить этот Shapelayer точно на правый глаз.shapeLayer.setAffineTransform(CGAffineTransform(translationX: 0, y: image.size.height))
shapeLayer.setAffineTransform(CGAffineTransform(scaleX: 1, y: -1))
Подробнее здесь: https://stackoverflow.com/questions/480 ... s11-vision
Cashapelayer перевернул координату при использовании с IOS11 Vision ⇐ IOS
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как преобразовать координату в собственном DPI в координату в логике DPI WPF?
Anonymous » » в форуме C# - 0 Ответы
- 65 Просмотры
-
Последнее сообщение Anonymous
-