1
我有一些代碼來創建一個HSV面具,看起來大約是這樣(從this Japanese-language page拍攝):有效的方式來產生一個三通道LUT掩蓋
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,它比我想要的要慢,可能是由於一些中間值。我懷疑可能有一種很好的方法可以將這一切摺疊成一兩個電話,但我不知道它會是什麼。編寫我自己的CUDA內核當然是一種選擇,但我想檢查一下,看看我是否不需要重新發明輪子。