微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Swift中快速将UInt转换为Float

如何解决在Swift中快速将UInt转换为Float

我正在对实时视频流进行一些实时图像分析。我正在使用vImage计算直方图和vDSP进行进一步处理。我有多年运行良好的Objective-C代码。我现在要将其转换为Swift。而且尽管它工作太慢。我发现主要问题是将vImage直方图(即UInt(vImagePixelCount))转换为vDSP可以处理的Float。在Objective-C中,我正在使用vDSP进行转换:

export QT_QPA_EVDEV_TOUCHSCREEN_ParaMETERS="rotate=0",

但是,vImage直方图是UInt,而不是UInt32,因此我不能在Swift中使用vDSP_vfltu32。相反,我正在使用

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

问题在于此代码比Objective-C版本慢100倍以上。有没有其他更快的选择?

解决方法

vImageHistogramCalculation_Planar8()将直方图写入具有256个类型为vImagePixelCount的元素的缓冲区中,该类型为C中unsigned long的类型别名,并且是64位的64位整数平台。

通过将对vDSP_vfltu32 ()的调用中的无符号长指针转换为无符号int指针并将步幅设置为2,您的Objective-C代码“作弊”。因此,这里发生的是将每个unsigned long的低32位转换为float。只要计数不超过2 32 -1。

您可以在Swift中进行完全相同的操作,只不过这里的类型转换是通过“重新绑定”内存来完成的:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。