AVMetaDataObject.bounds到SwiftUI位置?

AVMetaDataObject.bounds到SwiftUI位置?,swift,swiftui,Swift,Swiftui,我有两种看法。父视图保存一个CameraFeedUIViewControllerRepresentable,它传递回AVMetadataFaceObject的边界。我试图在边界应该在的地方画覆盖图。我有点接近了,但是我的映射不太正确。CameraFeed传回一组标量样式的边界,我将几何体读取器乘以它 X和Y好像互换了?(橙色方块效果不好,蓝色方块效果更好) 这个位置不是很完美 感谢:顺便说一句,感谢Wift和示例的黑客攻击。他们非常有助于实现这一目标 我知道我可以在AV对象中使用CALaye

我有两种看法。父视图保存一个
CameraFeed
UIViewControllerRepresentable,它传递回
AVMetadataFaceObject
的边界。我试图在边界应该在的地方画覆盖图。我有点接近了,但是我的映射不太正确。
CameraFeed
传回一组标量样式的边界,我将几何体读取器乘以它

  • X和Y好像互换了?(橙色方块效果不好,蓝色方块效果更好)
  • 这个位置不是很完美
感谢:顺便说一句,感谢Wift和示例的黑客攻击。他们非常有助于实现这一目标

我知道我可以在AV对象中使用
CALayer
,如果我这样做,我可以使用更多,但我正在考虑是否可以先尝试这种方法。我也知道我也可以使用
CIFaceFeature
。此外,我没有一个真正的深度前置摄像头。我只是想看看我是否可以劫持这个看似最简单的解决方案,让它发挥作用

关于
AVMetaDataObject
的边界是如何工作的,以及如何进行参照系转换,我缺少了什么?提前谢谢

struct CameraFeedView:视图{
@状态变量foundFace:CGRect?
@状态变量geometryRect:CGRect=CGRect(x:0,y:0,宽度:0,高度:0)
//@状态变量foundFaceAdjusted:CGRect?
//var testRect:CGRect=CGRect(
//x:0.44112000039964916,
//y:0.1979580322805941,
//宽度:0.333759992007017,
//高度:0.5941303606941507)
var body:一些观点{
GeometryReader(内容:{geometry in
ZStack{
CameraFeed(代码类型:[.face],完成:handleCameraReturn)
如果(foundFace!=零){
矩形()
.中风(
.foregroundColor(.橙色)
.frame(宽度:100,高度:100,对齐方式:。顶部引导)
.职位(
x:geometry.size.width*foundFace!.origin.x,
y:geometry.size.height*foundFace!.origin.y)
FoundObject(frameRect:geometryRect,boundsRect:foundFace!)
.中风(
.foregroundColor(.blue)
}
}
.onAppear(表演:{
设frame=geometry.frame(in:.全局)
geometryRect=CGRect(
原点:CGPoint(x:frame.minX,y:frame.minY),
大小:geometry.size
)
})
})
}
func handleCameraReturn(结果:结果){
切换结果{
成功案例(让边界):
打印(边界)
foundFace=边界
//TODO:添加计时器
案例。失败(let错误):
打印(“扫描失败:\(错误)”)
foundFace=nil
}
}
}
结构FoundObject:形状{
func reMapBoundries(frameRect:CGRect,boundsRect:CGRect)->CGRect{
//Y有界于宽度?真的吗?
设newY=(frameRect.width*boundsRect.origin.x)+(1.0-frameRect.origin.x)
//X有界于高度?真的吗?
设newX=(frameRect.height*boundsRect.origin.y)+(1.0-frameRect.origin.y)
设newWidth=100/(frameRect.width*boundsRect.width)
设newHeight=100/(frameRect.height*boundsRect.height)
设newRect=CGRect(
原点:CGPoint(x:newX,y:newY),
大小:CGSize(宽度:newWidth,高度:newHeight))
返回newRect
}
让frameRect:CGRect
让boundsRect:cRect
func路径(在rect:CGRect中)->path{
var path=path()
addRect(reMapBoundries(frameRect:frameRect,boundsRect:boundsRect))
返回路径
}
}

感谢@pawello2222提供的格式化帮助!
struct CameraFeedView: View {
    @State var foundFace:CGRect?
    @State var geometryRect:CGRect = CGRect(x: 0, y: 0, width: 0, height: 0)
    //@State var foundFaceAdjusted:CGRect?
    //var testRect:CGRect = CGRect(
    //           x: 0.44112000039964916, 
    //           y: 0.1979580322805941, 
    //           width: 0.3337599992007017, 
    //           height: 0.5941303606941507)
    
    var body: some View {
        GeometryReader(content: { geometry in
            ZStack {
                CameraFeed(codeTypes: [.face], completion: handleCameraReturn)
                if (foundFace != nil) {
                    Rectangle()
                        .stroke()
                        .foregroundColor(.orange)
                        .frame(width: 100, height: 100, alignment: .topLeading)
                        .position(
                            x: geometry.size.width * foundFace!.origin.x, 
                            y: geometry.size.height * foundFace!.origin.y)
                        
                    FoundObject(frameRect: geometryRect, boundsRect: foundFace!)
                        .stroke()
                        .foregroundColor(.blue)
                }
            }
            .onAppear(perform: {
                let frame = geometry.frame(in: .global)
                geometryRect = CGRect(
                                origin: CGPoint(x: frame.minX, y: frame.minY), 
                                size: geometry.size
                               )
            })
        })
        
    }
    
    func handleCameraReturn(result: Result<CGRect, CameraFeed.CameraError>) {
        switch result {
        case .success(let bounds):
            print(bounds)
            foundFace = bounds
            //TODO: Add a timer
        case .failure(let error):
            print("Scanning failed: \(error)")
            foundFace = nil
        }
    }

}

struct FoundObject: Shape {
    func reMapBoundries(frameRect:CGRect, boundsRect:CGRect) -> CGRect {
        //Y bounded to width? Really?
        let newY = (frameRect.width * boundsRect.origin.x) + (1.0-frameRect.origin.x)
        //X bounded to height? Really?
        let newX = (frameRect.height * boundsRect.origin.y) + (1.0-frameRect.origin.y)
        let newWidth = 100//(frameRect.width * boundsRect.width)
        let newHeight = 100//(frameRect.height * boundsRect.height)
        let newRect = CGRect(
              origin: CGPoint(x: newX, y: newY), 
              size: CGSize(width: newWidth, height: newHeight))
        return newRect
    }
    
    let frameRect:CGRect
    let boundsRect:CGRect
    func path(in rect: CGRect) -> Path {
        var path = Path()
        path.addRect(reMapBoundries(frameRect: frameRect, boundsRect: boundsRect))
        return path
    }
}