【问题标题】:iOS Vision detect light on binarized imageiOS Vision 检测二值化图像上的光线
【发布时间】:2017-12-01 04:32:00
【问题描述】:

我遇到了一些问题。如何定义二值化图像上的光点。我现在正在使用 ios11 和 Vision。

我使用二值化过滤器CIColorControls(也尝试将其与CIColorInvert结合使用)。
对于光检测,我使用VNImageRequestHandlerVNDetectRectanglesRequest。 在VNDetectRectanglesRequest 我检查VNDetectedObjectObservation 但无法实现 100% 的帧检测(有时应用无法识别帧上的光点)。我做错了什么?感谢任何帮助

这是我的代码

 lazy var rectanglesRequest: VNDetectRectanglesRequest = {
        return VNDetectRectanglesRequest(completionHandler: self.handleRectangles)
    }()

 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
            connection.videoOrientation = AVCaptureVideoOrientation.portrait
            guard let uiImage = imageFromSampleBuffer(sampleBuffer: sampleBuffer) else { return }

            let correctedImage = uiImage
                .applyingFilter("CIColorControls", withInputParameters: [
                    kCIInputSaturationKey: 0,
                    kCIInputContrastKey: 4.5,
                    kCIInputBrightnessKey: -1.54
                    ])
                //.applyingFilter("CIColorInvert", withInputParameters: nil)
              self.searchLightSpot(ciImage: correctedImage)

            DispatchQueue.main.async { [unowned self] in //unowned
                self.frameImageView.image = UIImage(ciImage: correctedImage)
            }
        }

 func searchLightSpot(ciImage: CIImage) {
        var requestOptions: [VNImageOption: Any] = [:]
        let handler = VNImageRequestHandler(ciImage: ciImage, options: requestOptions)
        DispatchQueue.global(qos: .userInteractive).async {
            do {
                try handler.perform([self.rectanglesRequest])
            } catch {
                print(error)
            }
        }
    }

func handleRectangles(request: VNRequest, error: Error?) {
        guard let observations = request.results as? [VNDetectedObjectObservation]
            else {
                print("unexpected result type from VNDetectedObjectObservation")
                return
        }
        guard let detectedObject = observations.first else {
                print("not detected object")
            return
        }

        print("detected object: ", detectedObject)
    }

【问题讨论】:

    标签: image-processing computer-vision core-image ios11 coreml


    【解决方案1】:

    在进行额外研究后,我了解到 Apple 似乎对框架进行了额外优化

    例如,如果我们在第 1 帧中获得了光,那么接下来的 5 帧将是相同的 它将向我们显示相同的帧,所以改为 5 帧 - 我们只有 1 这意味着我们不能在 100% 确定的情况下每秒中继静态帧数

    所以我无法检测到信号持续时间等等......

    可能的解决方案之一是:

    1.我们可以启动计时器,它会从相机获取当前帧(例如每 100 毫秒)

    2。然后我们将检查框架是否有白点。基于直方图的这些结果

    y - 颜色(如果帧上存在白色,则显示 0/1)

    x - 时间线(毫秒)

    3.所以这个图的输出可能是

    [01111100001111…]
    

    4.然后我们可以分析和检测信号

    您可以使用EasyImagy 并编写您自己的扩展来二值化和检测白点

      extension Image  where Pixel == RGBA {
    
            fileprivate func getPixelCount() -> Int {
                return Int(10 * width / 100)
            }
    
            func binarize() -> (isWhite: Bool, binarizedImage: Image<RGBA>) {
    
                var kWidth = 0
                var img = self
                let pixelCount = getPixelCount()
                for x in 0..<width{
                    var kHeight = 0
                    for y in 0..<height {
    
                        if let _pixel = pixel(x, y) {
                            if _pixel.gray < 245 {
                                img[x, y] = .black
                                kHeight = 0
                            } else {
                                img[x, y] = .white
                                kHeight += 1
                            }
    
                            if kHeight > pixelCount {
                                kWidth += 1
                                break
                            }
                        }
                    }
                    print("Hwhite: \(kHeight) Wwhite: \(kWidth)")
                    if kHeight >= pixelCount && kWidth >= pixelCount  {
                        return (true, img)
                    }
                }
                return (false, img)
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 1970-01-01
      相关资源
      最近更新 更多