我在實時攝像頭饋送中使用關于視覺套件中人臉檢測的 Apple 教程,而不是影像。
https://developer.apple.com/documentation/vision/tracking_the_user_s_face_in_real_time
它檢測面部并添加一些線條,用于在面部CAShapeLayer的不同部分之間繪制線條。
fileprivate func setupVisionDrawingLayers() {
let captureDeviceResolution = self.captureDeviceResolution
let captureDeviceBounds = CGRect(x: 0,
y: 0,
width: captureDeviceResolution.width,
height: captureDeviceResolution.height)
let captureDeviceBoundsCenterPoint = CGPoint(x: captureDeviceBounds.midX,
y: captureDeviceBounds.midY)
let normalizedCenterPoint = CGPoint(x: 0.5, y: 0.5)
guard let rootLayer = self.rootLayer else {
self.presentErrorAlert(message: "view was not property initialized")
return
}
let overlayLayer = CALayer()
overlayLayer.name = "DetectionOverlay"
overlayLayer.masksToBounds = true
overlayLayer.anchorPoint = normalizedCenterPoint
overlayLayer.bounds = captureDeviceBounds
overlayLayer.position = CGPoint(x: rootLayer.bounds.midX, y: rootLayer.bounds.midY)
let faceRectangleShapeLayer = CAShapeLayer()
faceRectangleShapeLayer.name = "RectangleOutlineLayer"
faceRectangleShapeLayer.bounds = captureDeviceBounds
faceRectangleShapeLayer.anchorPoint = normalizedCenterPoint
faceRectangleShapeLayer.position = captureDeviceBoundsCenterPoint
faceRectangleShapeLayer.fillColor = nil
faceRectangleShapeLayer.strokeColor = UIColor.green.withAlphaComponent(0.7).cgColor
faceRectangleShapeLayer.lineWidth = 5
faceRectangleShapeLayer.shadowOpacity = 0.7
faceRectangleShapeLayer.shadowRadius = 5
let faceLandmarksShapeLayer = CAShapeLayer()
faceLandmarksShapeLayer.name = "FaceLandmarksLayer"
faceLandmarksShapeLayer.bounds = captureDeviceBounds
faceLandmarksShapeLayer.anchorPoint = normalizedCenterPoint
faceLandmarksShapeLayer.position = captureDeviceBoundsCenterPoint
faceLandmarksShapeLayer.fillColor = nil
faceLandmarksShapeLayer.strokeColor = UIColor.yellow.withAlphaComponent(0.7).cgColor
faceLandmarksShapeLayer.lineWidth = 3
faceLandmarksShapeLayer.shadowOpacity = 0.7
faceLandmarksShapeLayer.shadowRadius = 5
overlayLayer.addSublayer(faceRectangleShapeLayer)
faceRectangleShapeLayer.addSublayer(faceLandmarksShapeLayer)
rootLayer.addSublayer(overlayLayer)
self.detectionOverlayLayer = overlayLayer
self.detectedFaceRectangleShapeLayer = faceRectangleShapeLayer
self.detectedFaceLandmarksShapeLayer = faceLandmarksShapeLayer
self.updateLayerGeometry()
}
如何用模糊的視圖填充線條(臉部的不同部分)?我需要模糊臉部。
uj5u.com熱心網友回復:
您可以嘗試在視頻源頂部放置一個UIVisualEffectView,然后在其中添加一個遮罩 CAShapeLayer UIVisualEffectView。我不知道這是否可行。
上的檔案UIVisualEffectView說:
使用 UIVisualEffectView 類時,避免小于 1 的 alpha 值。創建部分透明的視圖會導致系統在螢屏外渲染程序中合并視圖和所有關聯的子視圖。UIVisualEffectView 物件需要作為內容的一部分進行組合,以使其看起來正確。在視覺效果視圖或其任何超級視圖上將 alpha 設定為小于 1 會導致許多效果看起來不正確或根本不顯示。
我不知道在視覺效果視圖上使用遮罩層是否會導致相同的渲染問題。你必須嘗試一下。(并且一定要在一系列不同的硬體上進行嘗試,因為不同版本的 Apple 芯片組之間的渲染性能差異很大。)
您也可以嘗試使用填充了視覺散列或“像素化”圖案的形狀層,而不是模糊。那會更快,并且可能渲染更可靠。
請注意,人臉檢測往往有點跳躍。它可能會丟失幾幀,或者滯后于快速平移或場景變化。如果您試圖在實時供稿中隱藏人們的面孔以保護隱私,則可能不可靠。只需要幾個不模糊的框架就可以揭示某人的身份。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497957.html
