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

2

コメントアウトした行はほぼ正しいので、元に戻す必要がありますが、次のように変更します。

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

あなたの「悪いケース」の例である正方形は、実際には右側の柔らかいおもちゃのものです。良いものは画面の中央にあるので正しく見えます。

于 2017-09-26T09:52:00.173 に答える