4

Apple 在 iOS 11 中有新功能,允许您使用视觉框架在没有模型的情况下进行对象检测。我尝试了这些新的 API,但发现VNDetectRectanglesRequest 的结果并不好。我是否正确使用 API?

这是一个很好的案例:

在此处输入图像描述

在此处输入图像描述

还有一些不好的情况:

在此处输入图像描述

这是我的代码:

 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)

        // create the request

        let request2 = VNDetectRectanglesRequest { (request, error) in
            self.VNDetectRectanglesRequestCompletionBlock(request: request, error: error)
        }

        do {
            request2.minimumConfidence = 0.7
            try self.visionSequenceHandler.perform([request2], on: pixelBuffer)
        } catch {
            print("Throws: \(error)")
        }
    }


func VNDetectRectanglesRequestCompletionBlock(request: VNRequest, error: Error?) {
        if let array = request.results {
            if array.count > 0 {
                let ob = array.first as? VNRectangleObservation
                print("count: \(array.count)")
                print("fps: \(self.measureFPS())")
                DispatchQueue.main.async {
                    let boxRect = ob!.boundingBox
                    let transRect = self.transformRect(fromRect: boxRect, toViewRect: self.cameraLayer.frame)
                    var transformedRect = ob!.boundingBox
                    //transformedRect.origin.y = 1 - transformedRect.origin.y
                    let convertedRect = self.cameraLayer.layerRectConverted(fromMetadataOutputRect: transformedRect)

                    self.highlightView?.frame = convertedRect

                }
            }
        }
    }
4

2 回答 2

6

已经提出了很多误解、期望和黑盒问题。但除此之外,您还错误地使用了 API。

矩形检测器会在图像中找到代表真实世界矩形形状的区域。在大多数情况下,拍摄图像的相机会看到一个真实的矩形对象——因此它在 2D 图像平面上的 3D 投影通常不会是矩形的。例如,您的一张照片中计算机屏幕的 2D 投影更呈梯形,因为顶角比底角离相机更远。

您可以通过查看检测到的矩形的实际角来获得此形状 - 请参阅VNRectangleObservation对象的属性。如果您在这四个角之间画线,您通常会在照片中找到更好地跟踪计算机屏幕、纸片等形状的东西。

相反,该boundingBox属性会为您提供包含这些角点的最小矩形区域(即图像空间中的矩形)。因此,除非您的相机视角恰到好处,否则它不会遵循真实矩形对象的形状。

于 2017-10-09T21:14:47.463 回答
2

您注释掉的行几乎是正确的,您需要将其放回原处,但将其更改为:

transformedRect.origin.y = 1 - (transformedRect.origin.y + transformedRect.width)

您的“坏情况”示例正方形实际上来自右侧的毛绒玩具。您的好人看起来不错,因为它们位于屏幕中央。

于 2017-09-26T09:52:00.173 回答