首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS 11使用视觉框架VNDetectRectanglesRequest做目标检测不准确吗?

iOS 11使用视觉框架VNDetectRectanglesRequest做目标检测不准确吗?
EN

Stack Overflow用户
提问于 2017-09-07 12:10:42
回答 2查看 7.3K关注 0票数 4

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

以下是一些很好的案例:

还有一些不好的情况:

这是我的代码:

代码语言:javascript
复制
 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

                }
            }
        }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-09 21:14:47

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

矩形检测器在图像中找到那些看起来代表真实世界的矩形形状的区域.在大多数情况下,相机捕捉图像时会看到一个真实的矩形物体,因此它在二维图像平面上的三维投影通常不会是矩形的。例如,计算机屏幕的2D投影在你的照片中是更梯形的,因为顶部的角比下角离相机更远。

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

相反,boundingBox属性将获得包含这些角点的最小矩形区域--即图像空间中的矩形区域。所以它不会跟随一个真正的矩形物体的形状,除非你的相机视角是正确的。

票数 6
EN

Stack Overflow用户

发布于 2017-09-26 09:52:00

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

代码语言:javascript
复制
transformedRect.origin.y = 1 - (transformedRect.origin.y + transformedRect.width)

你的“坏案例”的例子,正方形实际上是从右边的软玩具。你的好照片看上去是对的,因为它们在屏幕中央。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46095984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档