我正在研究一种图像处理算法,并且正在研究使用 NEON 对其进行优化。该算法包括将每个(RGBA,8bit)像素乘以一些权重,进行一些加法并最终转换回 uint8_t 值。我遇到的第一个问题是如何有效地加载单个 uint8_t 像素并将其转换为 NEON 的 float32x4_t。我已经在参考中搜索了合适的转换,但找不到合适的转换,所以我求助于这个丑陋的代码:
const uint8_t* psrc = ...; // pointer to image data
float rgba[4];
for (int c = 0; c < 4; ++c) {
rgba[c] = *psrc++;
}
float32x4_t srcpix = vld1q_f32(rgba);
任何人都可以为此建议一种“更清洁”的方式吗?
编辑:所以我想出了这个,仍然觉得很麻烦:
uint8x8_t srcu8 = vld1_u8(psrc);
uint16x8_t srcu16x8 = vmovl_u8(srcu8);
uint16x4_t srcu16x4 = vget_low_u16(srcu16x8);
uint32x4_t srcu32x4 = vmovl_u16(srcu16x4);
srcpix = vcvtq_f32_u32(srcu32x4);