生成三通道LUT掩模的有效方法

时间:2016-06-14 02:57:48

标签: c++ opencv

我有一些代码来创建一个看起来大致相似的HSV蒙版(取自this Japanese-language page):

void colorExtraction(const cv::gpu::GpuMat &src,
                     cv::gpu::GpuMat       *dst)
{
    cv::Mat lut(256, 1, CV_8UC3);
    for (int i = 0; i < 256; i++)
    {
        cv::Vec3b thisHSV;
        thisHSV[0] = inHRange(i) ? 255 : 0;
        thisHSV[1] = inSRange(i) ? 255 : 0;
        thisHSV[2] = inVRange(i) ? 255 : 0;

        lut.at<cv::Vec3b>(i) = thisHSV;
    }

    /* apply LUT to input image */
    cv::gpu::GpuMat extracted(src.size(), CV_8UC3);
    cv::gpu::LUT(src, lut, extracted);

    /* divide image into each channel */
    std::vector<cv::gpu::GpuMat> channels;
    cv::gpu::split(extracted, channels);

    /* create mask */
    cv::gpu::bitwise_and(channels[0], channels[1], *dst);
    cv::gpu::bitwise_and(*dst, channels[2], *dst);
}

这很有效,但是尽管操作主要在GPU中,但它比我想要的慢,可能是由于许多中间GpuMat。我怀疑可能有一种很好的方式将这一切都折叠成一两个电话,但我不知道它可能是什么。当然,编写我自己的CUDA内核是一种选择,但我想检查一下我是否不需要重新发明轮子。

1 个答案:

答案 0 :(得分:1)

要自我回答,我最终编写了自己的内核,以便在一次调用中执行!importantLUT()和两个split()

bitwise_and()