uint64_t sum = 0;
const uint8_t* src = (const uint8_t*)gray.data;
int i, k, w = gray.cols, h = gray.rows, pitch = gray.step.p[0], w32 = w >> 5 << 5;
for(i = 0; i < h; ++ i)
{
const uint8_t* line = src;
for(k = 0; k < w32; k += 32)
{
uint8x16_t a16 = vld1q_u8(line); line += 16;
uint8x16_t b16 = vld1q_u8(line); line += 16;
uint16x8_t a8 = vpaddlq_u8(a16);
uint16x8_t b8 = vpaddlq_u8(b16);
uint32x4_t a4 = vpaddlq_u16(a8);
uint32x4_t b4 = vpaddlq_u16(b8);
uint64x2_t a2 = vpaddlq_u32(a4);
a2 = vpadalq_u32(a2, b4);
sum += vgetq_lane_u64(a2, 0) + vgetq_lane_u64(a2, 1);
}
for( ; k < w; ++ k)
sum += src[k];
src += pitch;
}
printf("%f\t%f", (double)sum / (double)(w * h), cv::mean(gray));
Когда я проверял двоичное изображение, результат был равен.Когда изображение серого цвета, результат не равен, но я не могу найти проблему в своем коде.
Редактировать: теперь верхний код верен, эталон цикла 1000 раз для 8-битного серого изображения:
cv :: среднее 0,000328 myMean 0,000091