經過幾天的研究,我能夠撰寫以下 Swift 類,正如您所看到的,它執行類似于Apple 的 WWDC 深度資料演示中提到的AVCameraCalibrationData.h檔案第 20 行的參考示例,以演示如何正確修正深度資料。它編譯得很好,但帶有注釋表示的棄用警告:
class Undistorter : NSObject {
var result: CGPoint!
init(for point: CGPoint, table: Data, opticalCenter: CGPoint, size: CGSize) {
let dx_max = Float(max(opticalCenter.x, size.width - opticalCenter.x))
let dy_max = Float(max(opticalCenter.y, size.width - opticalCenter.y))
let max_rad = sqrt(pow(dx_max,2) - pow(dy_max, 2))
let vx = Float(point.x - opticalCenter.x)
let vy = Float(point.y - opticalCenter.y)
let r = sqrt(pow(vx, 2) - pow(vy, 2))
// deprecation warning: “'withUnsafeBytes' is deprecated: use withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R instead”
let mag: Float = table.withUnsafeBytes({ (tableValues: UnsafePointer<Float>) in
let count = table.count / MemoryLayout<Float>.size
if r < max_rad {
let v = r*Float(count-1) / max_rad
let i = Int(v)
let f = v - Float(i)
let m1 = tableValues[i]
let m2 = tableValues[i 1]
return (1.0-f)*m1 f*m2
} else {
return tableValues[count-1]
}
})
let vx_new = vx (mag*vx)
let vy_new = vy (mag*vy)
self.result = CGPoint(
x: opticalCenter.x CGFloat(vx_new),
y: opticalCenter.y CGFloat(vy_new)
)
}
}
盡管這是一個非常常見的警告,存在大量示例,但我還沒有找到任何適合此用例的問題答案示例——目前存在的所有試圖讓它作業的人的示例都涉及網路背景關系,并嘗試修改此代碼以在這些位置添加修復程式,最終導致錯誤。例如,在嘗試使用此修復程式時:
let mag: Float = table.withUnsafeBytes { $0.load(as: Float) in // 6 errors introduced
因此,如果有任何方法可以在不引入錯誤的情況下解決此問題,我想知道。
更新:它確實有效;請參閱我對我自己問題的回答。
uj5u.com熱心網友回復:
原來這只是添加一行的問題:
let mag: Float = table.withUnsafeBytes {
let tableValues = $0.load(as: [Float].self)
現在它編譯沒有問題。
編輯:還考慮了 Rob Napier 關于使用值的計數而不需要除以元素的大小的建議。
uj5u.com熱心網友回復:
您正在使用過時UnsafePointer的版本withUnsafeBytes。新版本通過UnsafeBufferPointer。所以而不是這個:
let mag: Float = table.withUnsafeBytes({ (tableValues: UnsafePointer<Float>) in
你是這個意思:
let mag: Float = table.withUnsafeBytes({ (tableValues: UnsafeBufferPointer<Float>) in
代替:
let count = table.count / MemoryLayout<Float>.size
(這是從來沒有合法的,因為你不能訪問table內table.withUnsafeBytes),你現在想要的:
let count = tableValues.count
不需要除以元素的大小。
而不是 tableValues,您將使用tableValues.baseAddress!. 由于大小,您的其他代碼可能需要一些修復;我不完全確定它在做什么。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/367358.html
上一篇:類中宣告的字串不斷恢復為原始值
