语言:斯威夫特 3
我正在使用: 硬件:一部 iPhone 6 和 FLIR One 热像仪 软件:Xcode 8.1,锁定 FLIROne SDK(为 obj-c 编写和记录,几乎没有文档)
我正在尝试做的事情:从返回的相机流中获取中心像素的温度
问题:我正在构建应用程序中的所有内容并按预期工作,不包括获取此热数据。我已经能够从相机返回的流中获取温度,但是我只能获取 0,0(左上角)像素的温度。我在流输入的图像视图的中心有十字准线,我想在这个中心点(图像的确切中心)获取像素。我已经为此工作了两天,我似乎无法弄清楚如何做到这一点。SDK不允许您指定从哪个像素读取以及从我在线阅读的内容中读取,您必须循环遍历每个像素并停在中心像素。
下面的代码将从像素 0,0 获取温度并正确显示。我想获得温度来读取中心像素。温度必须是 UInt16 才能提供正确的开尔文读数(至少据我所知),但我从 Data 接收辐射数据!作为 UInt8。注意:NSData!不适用于这些代表。尝试使用它(即使在 swift 2.3 中)会导致委托永远不会触发。我必须使用数据!它甚至可以运行委托。我发现我不能使用 swift 2.3 很奇怪,因为它只有 NSData。如果这是因为我搞砸了,请告诉我。
func flirOneSDKDelegateManager(_ delegateManager: FLIROneSDKDelegateManager!, didReceiveRadiometricData radiometricData: Data!, imageSize size: CGSize) {
let byteArray = radiometricData?.withUnsafeBytes{
[UInt8](UnsafeBufferPointer(start: $0, count: (radiometricData?.count)!))
}
let temperature = UnsafePointer(byteArray!).withMemoryRebound(to: UInt16.self, capacity: 1){
$0.pointee
}
debugPrint(temperature)
DispatchQueue.main.async{
self.tempLabel.text = NSString(format: "%.1f",self.convertToFarenheit(kelvin: temperature)) as String
}
}
我是 Swift 新手,所以我不确定这是否是最好的方法,所以如果你有更好的方法,请告诉我。
当前解决方案: 获取中心像素,但不是动态的(这是我想要的)
let byteArray = radiometricData?.withUnsafeBytes{
[UInt8](UnsafeBufferPointer(start: $0, count: (radiometricData?.count)!))
}
let bytes:[UInt8] = [(byteArray?[74170])!,(byteArray?[74171])!]
let temperature = UnsafePointer(bytes).withMemoryRebound(to: UInt16.self, capacity: 1){
$0.pointee
}