iOS Vision 检测二值化图像上的光线
Posted
技术标签:
【中文标题】iOS Vision 检测二值化图像上的光线【英文标题】:iOS Vision detect light on binarized image 【发布时间】:2017-12-01 04:32:00 【问题描述】:我遇到了一些问题。如何定义二值化图像上的光点。我现在正在使用 ios11 和 Vision。
我使用二值化过滤器CIColorControls
(也尝试将其与CIColorInvert
结合使用)。
对于光检测,我使用VNImageRequestHandler
和VNDetectRectanglesRequest
。
在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)
【问题讨论】:
【参考方案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)
【讨论】:
以上是关于iOS Vision 检测二值化图像上的光线的主要内容,如果未能解决你的问题,请参考以下文章