opencv均值函数,用于通过霓虹灯实现灰度图像

时间:2018-09-28 06:26:57

标签: c++ opencv neon

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));

当我通过二进制图像进行测试时,结果是相等的。 当图像为灰度时,结果不相等,但是我在代码中找不到问题。

编辑:现在,上面的代码正确,对于一个8位灰度图像,循环1000次的基准是:

cv ::平均0.000328 myMean 0.000091

0 个答案:

没有答案