opencv средняя функция для реализации серого изображения через неон - PullRequest
0 голосов
/ 28 сентября 2018
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

...