如何解决在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 举报,一经查实,本站将立刻删除。