簡體   English   中英

Swift 中的快速 UInt 到 Float 轉換

[英]Fast UInt to Float conversion in Swift

我正在對實時視頻流進行一些實時圖像分析。 我正在使用 vImage 來計算直方圖和 vDSP 以進行進一步處理。 我有多年來一直運行良好的 Objective-C 代碼。 我現在要把它轉換成 Swift。雖然它能工作,但速度太慢了。 我發現主要問題是將 vImage 直方圖(即 UInt (vImagePixelCount))轉換為 vDSP 可以處理的 Float。 在 Objective-C 中,我使用 vDSP 進行轉換:

  err = vImageHistogramCalculation_Planar8(&vBuffY,histogramY, 0);
  vDSP_vfltu32((const unsigned int*)histogramY,2,histFloatY,1,256);

但是,vImage 直方圖是 UInt,而不是 UInt32,所以我不能在 Swift 中使用 vDSP_vfltu32。相反,我正在使用

  let err = vImageHistogramCalculation_Planar8(&vBuffY, &histogramY, 0)
  let histFloatY = histogramY.compactMap{ Float($0) }

問題是這段代碼比 objective-C 版本慢了 100 多倍。 有沒有更快的替代品?

vImageHistogramCalculation_Planar8()將直方圖寫入包含 256 個 vImagePixelCount 類型元素的緩沖區, vImagePixelCount是 C 中unsigned long的類型別名,在 64 位平台上是 64 位 integer。

您的 Objective-C 代碼通過在對vDSP_vfltu32 ()的調用中將 unsigned long 指針轉換為 unsigned int 指針並將步幅設置為2來“作弊”。 所以這里發生的是每個unsigned long的低 32 位被轉換為float 只要計數不超過值 2 32 -1,它就可以工作。

您可以在 Swift 中執行完全相同的操作,只是這里的類型轉換是通過“重新綁定”memory 來完成的:

let err = vImageHistogramCalculation_Planar8(&vBuffY, &histogramY, 0)
histogramY.withUnsafeBytes {
    let uint32ptr = $0.bindMemory(to: UInt32.self)
    vDSP_vfltu32(uint32ptr.baseAddress!, 2, &histFloatY, 1, 256);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM