Swift 3 循环到图像的中心像素
Swift 3 loop to center pixel of image
语言:
Swift3
我在用什么:
硬件:一台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: [=11=], count: (radiometricData?.count)!))
}
let temperature = UnsafePointer(byteArray!).withMemoryRebound(to: UInt16.self, capacity: 1){
[=11=].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: [=12=], count: (radiometricData?.count)!))
}
let bytes:[UInt8] = [(byteArray?[74170])!,(byteArray?[74171])!]
let temperature = UnsafePointer(bytes).withMemoryRebound(to: UInt16.self, capacity: 1){
[=12=].pointee
}
假设您尝试从 swift 的数据中读取一些 UInt16 值
import Foundation
var data = Data([1,0,2,0,255,255,1]) // 7 bytes
var arr: [UInt16] = []
// in my data only 6 bytes could be represented as Int16 values, so i have to ignore the last one ...
for i in stride(from: 0, to: 2 * (data.count / 2) , by: MemoryLayout<UInt16>.stride) {
arr.append(data.subdata(in: i..<(i+MemoryLayout<UInt16>.stride)).withUnsafeBytes { [=10=].pointee })
}
print(arr) // [1, 2, 65535]
或者你可以使用像
这样的东西
let arr0: [UInt16] = data.withUnsafeBytes { (p: UnsafePointer<UInt8>)->[UInt16] in
let capacity = data.count / MemoryLayout<UInt16>.stride
return p.withMemoryRebound(to: UInt16.self, capacity: capacity) {
var arr = [UInt16]()
for i in 0..<capacity {
arr.append(([=11=] + i).pointee)
}
return arr
}
}
print(arr0) // [1, 2, 65535]
或
extension Data {
func scan<T>(offset: Int, bytes: Int) -> T {
return self.subdata(in: offset..<(offset+bytes)).withUnsafeBytes { [=12=].pointee }
}
}
let k: UInt16 = data.scan(offset: 2, bytes: MemoryLayout<UInt16>.stride)
print(k) // 2
甚至更好
extension Data {
func scan<T>(from: Int)->T {
return self.withUnsafeBytes { (p: UnsafePointer<UInt8>)->T in
p.advanced(by: from).withMemoryRebound(to: T.self, capacity: 1) {
[=13=].pointee
}
}
}
}
let u0: UInt16 = data.scan(from: 2)
print(u0) // 2
或
extension Data {
func scan2<T>(from: Int)->T {
return self.withUnsafeBytes {
// Precondition: The underlying pointer plus offset is properly aligned for accessing T.
// Precondition: The memory is initialized to a value of some type, U, such that T is layout compatible with U.
UnsafeRawPointer([=14=]).load(fromByteOffset: from, as: T.self)
}
}
}
let u2: UInt16 = data.scan2(from: 2)
print(u2) // 2
您的数据中读取值的正确偏移量是多少?从你在问题中提供的信息很难说。
语言: Swift3
我在用什么: 硬件:一台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: [=11=], count: (radiometricData?.count)!))
}
let temperature = UnsafePointer(byteArray!).withMemoryRebound(to: UInt16.self, capacity: 1){
[=11=].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: [=12=], count: (radiometricData?.count)!))
}
let bytes:[UInt8] = [(byteArray?[74170])!,(byteArray?[74171])!]
let temperature = UnsafePointer(bytes).withMemoryRebound(to: UInt16.self, capacity: 1){
[=12=].pointee
}
假设您尝试从 swift 的数据中读取一些 UInt16 值
import Foundation
var data = Data([1,0,2,0,255,255,1]) // 7 bytes
var arr: [UInt16] = []
// in my data only 6 bytes could be represented as Int16 values, so i have to ignore the last one ...
for i in stride(from: 0, to: 2 * (data.count / 2) , by: MemoryLayout<UInt16>.stride) {
arr.append(data.subdata(in: i..<(i+MemoryLayout<UInt16>.stride)).withUnsafeBytes { [=10=].pointee })
}
print(arr) // [1, 2, 65535]
或者你可以使用像
这样的东西let arr0: [UInt16] = data.withUnsafeBytes { (p: UnsafePointer<UInt8>)->[UInt16] in
let capacity = data.count / MemoryLayout<UInt16>.stride
return p.withMemoryRebound(to: UInt16.self, capacity: capacity) {
var arr = [UInt16]()
for i in 0..<capacity {
arr.append(([=11=] + i).pointee)
}
return arr
}
}
print(arr0) // [1, 2, 65535]
或
extension Data {
func scan<T>(offset: Int, bytes: Int) -> T {
return self.subdata(in: offset..<(offset+bytes)).withUnsafeBytes { [=12=].pointee }
}
}
let k: UInt16 = data.scan(offset: 2, bytes: MemoryLayout<UInt16>.stride)
print(k) // 2
甚至更好
extension Data {
func scan<T>(from: Int)->T {
return self.withUnsafeBytes { (p: UnsafePointer<UInt8>)->T in
p.advanced(by: from).withMemoryRebound(to: T.self, capacity: 1) {
[=13=].pointee
}
}
}
}
let u0: UInt16 = data.scan(from: 2)
print(u0) // 2
或
extension Data {
func scan2<T>(from: Int)->T {
return self.withUnsafeBytes {
// Precondition: The underlying pointer plus offset is properly aligned for accessing T.
// Precondition: The memory is initialized to a value of some type, U, such that T is layout compatible with U.
UnsafeRawPointer([=14=]).load(fromByteOffset: from, as: T.self)
}
}
}
let u2: UInt16 = data.scan2(from: 2)
print(u2) // 2
您的数据中读取值的正确偏移量是多少?从你在问题中提供的信息很难说。