给定许多项目的图像,其所有边界框都以像素坐标已知。
我试图在每个项目周围提取一个区域(周围),使用 AKAZE 计算其描述符和特征,以便相互比较。
但是我意识到这可能太慢了,因为它涉及:
1) 裁剪每个项目以生成许多图像,
2) 对每个图像进行检测和计算以生成关键点和描述符。
或者,为了加快速度,我在考虑:
1)调整整幅图像的大小,然后进行一次关键点的检测和计算。
2) 然后为了获得特定对象的关键点,我们只需检索与对象位置对应的一组预先计算的关键点。
我的问题是这种方法在功能上是合理的,这是否会产生任何后果?
最佳答案
是的,第二种策略是一个很好的方法。要有效地执行此操作,您应该在调用 OpenCV 的 detectAndCompute
(或 detect
,如果您正在使用它)时提供一个掩码参数。你的面具应该和你的形象一样大。在掩码的每个像素中,如果像素不位于至少一个检测区域内,则该像素将为零,否则其值为正(uchar 掩码为 255)。
事实上,使用第一种策略时,您可能会在检测区域的边界遇到问题,可能会遗漏特征点。这是因为特征检测和描述符计算需要处理每个像素周围的一个小像素窗口(在边界处不可用)。要正确处理此问题,您需要在裁剪之前扩大检测区域。
关于效率,您应该意识到第二种方法存在开销,即完整图像将在特征检测之前进行一些图像预处理。对于 AKAZE,这是非线性扩散,而对于 SIFT 和 SURF 等其他算法,这是图像卷积。这些是构建所谓的图像金字塔所必需的。在只有少量检测的情况下,第一种策略可能更有效(图像裁剪的开销相对于图像预处理来说很小)。
关于opencv - 裁剪关键点与裁剪图像和寻找关键点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48180264/