当用作子VC

问题描述

我正在尝试使用Apple的Vision框架中的VNDetectRectangleRequest来自动获取卡的图片。但是,当我转换点以绘制矩形时,它的形状不正确,并且不应该遵循矩形。我一直在密切关注这篇文章https://heartbeat.fritz.ai/scanning-credit-cards-with-computer-vision-on-ios-c3f4d8912de4 一个主要区别是我将CameraCaptureVC嵌入到另一个ViewController中,以便仅在此较小的窗口中才扫描卡。

下面是如何在父vc中设置摄像机vc(从viewDidLoad调用)。

func configureSubviews() {
    clearView.addSubview(cameraVC.view)
    cameraVC.view.autoPinEdgesToSuperviewEdges()
    self.addChild(cameraVC)
    cameraVC.didMove(toParent: self)
}

下面是绘制矩形的代码

func createLayer(in rect: CGRect) {
    let maskLayer = CAShapeLayer()
    maskLayer.frame = rect
    maskLayer.cornerRadius = 10
    maskLayer.opacity = 0.75
    maskLayer.borderColor = UIColor.red.cgColor
    maskLayer.borderWidth = 5.0

    previewLayer.insertSublayer(maskLayer,at: 1)
}

func removeMask() {
    if let sublayer = previewLayer.sublayers?.first(where: { $0 as? CAShapeLayer != nil }) {
        sublayer.removeFromSuperlayer()
    }
}

func drawBoundingBox(rect : VNRectangleObservation) {
    let transform = CGAffineTransform(scaleX: 1,y: -1).translatedBy(x: 0,y: -finalFrame.height)

    let scale = CGAffineTransform.identity.scaledBy(x: finalFrame.width,y: finalFrame.height)

    let bounds = rect.boundingBox.applying(scale).applying(transform)

    createLayer(in: bounds)
}

func detectRectangle(in image: CVPixelBuffer) {
    let request = VNDetectRectanglesRequest { (request: VNRequest,error: Error?) in
        DispatchQueue.main.async {
            guard let results = request.results as? [VNRectangleObservation],let rect = results.first else { return }
            self.removeMask()
            self.drawBoundingBox(rect: rect)
        }
    }
    request.minimumAspectRatio = 0.0
    request.maximumAspectRatio = 1.0
    request.maximumObservations = 0
    let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: image,options: [:])
    try? imageRequestHandler.perform([request])
}

这是我的结果。红色矩形应遵循卡片的边框,但是它太短了,原点甚至不在卡片的顶部。

enter image description here

我尝试在drawBoundingBox函数中更改值,但似乎无济于事。我也尝试过像下面这样用不同的方式转换界限,但是结果是一样的,改变这些值会很麻烦。

    let scaledHeight: CGFloat = originalFrame.width / finalFrame.width * finalFrame.height
    let boundingBox = rect.boundingBox
    let x = finalFrame.width * boundingBox.origin.x
    let height = scaledHeight * boundingBox.height
    let y = scaledHeight * (1 - boundingBox.origin.y) - height
    let width = finalFrame.width * boundingBox.width

    let bounds = CGRect(x: x,y: y,width: width,height: height)
    createLayer(in: bounds)

非常感谢您的帮助。也许因为我将其作为儿童VC嵌入,所以我需要第二次变换坐标?我尝试这样的尝试无济于事,但也许我做错了或缺少了一些东西

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)