我有一些代码来创建一个看起来大致相似的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内核是一种选择,但我想检查一下我是否不需要重新发明轮子。
答案 0 :(得分:1)
要自我回答,我最终编写了自己的内核,以便在一次调用中执行!important
,LUT()
和两个split()
:
bitwise_and()