#include commonhpp#include vector#include cstringnamespace CAROTENE_NS #define ENABLE4LINESMATCHING false Disabled since overall time for simultaneous 4 lines matching is greater than
该源代码实现了模板匹配的函数matchTemplate。主要使用了NEON指令进行优化。
首先,判断模板大小是否支持NEON优化,模板大小要求宽度大于等于8,且宽度乘以高度小于等于256。
然后,进行模板匹配的计算。使用NEON指令进行优化的部分是计算模板和图像的点乘。
首先,定义了一些变量,如模板的宽度tmplW,模板的高度tmplH,结果的宽度dstW,结果的高度dstH。
接下来,根据是否启用了ENABLE4LINESMATCHING宏来选择不同的计算方式。
如果启用了ENABLE4LINESMATCHING,则同时计算4行结果。首先对结果的宽度进行处理,将其向下取整到能被4整除的数dstroiw4。
然后,对于每一行r,计算模板和图像的点乘。首先定义一个长度为4的数组dot,用于存储每个结果的点乘值。
然后,对于每一行的每一列c,进行点乘计算。首先定义4个长度为4的向量vdot0,vdot1,vdot2,vdot3,初始化为0。
然后,对于模板的每一行i,计算模板和图像的点乘。首先定义两个指针img和tmpl,分别指向图像和模板的起始位置。
然后,对于模板的每一列j,使用NEON指令进行点乘计算。首先加载模板和图像的数据,分别用vtmpl,vimg0,vimg1,vimg2,vimg3表示。
然后,使用vmull_u8函数进行点乘计算,再使用vpadalq_u16函数进行累加。
最后,使用vst1q_f32函数将结果存储到corr中。
如果不启用ENABLE4LINESMATCHING,则同时计算2行结果。首先对结果的宽度进行处理,将其向下取整到能被2整除的数dstroiw2。
然后,对于每一行r,计算模板和图像的点乘。首先定义一个长度为2的数组dot,用于存储每个结果的点乘值。
然后,对于每一行的每一列c,进行点乘计算。首先定义两个长度为4的向量vdot0,vdot1,初始化为0。
然后,对于模板的每一行i,计算模板和图像的点乘。首先定义两个指针img和tmpl,分别指向图像和模板的起始位置。
然后,对于模板的每一列j,使用NEON指令进行点乘计算。首先加载模板和图像的数据,分别用vtmpl,vimg0,vimg1表示。
然后,使用vmull_u8函数进行点乘计算,再使用vpadalq_u16函数进行累加。
最后,使用vst1_f32函数将结果存储到corr中。
如果不启用ENABLE4LINESMATCHING,并且结果的宽度不能被2整除,则单独计算一行结果。首先定义一个变量dot,用于存储结果的点乘值,初始化为0。
然后,对于模板的每一行i,计算模板和图像的点乘。首先定义一个指针img和tmpl,分别指向图像和模板的起始位置。
然后,对于模板的每一列j,使用NEON指令进行点乘计算。首先加载模板和图像的数据,分别用vtmpl和vimg表示。
然后,使用vmull_u8函数进行点乘计算,再使用vpadalq_u16函数进行累加。
最后,将结果存储到dot中,再累加到corr中。
最后,进行归一化处理。首先计算模板的L2范数tn。
然后,计算图像的积分图,用于计算归一化因子。首先定义一个长度为(iw+1)*(ih+1)的数组sqsum,用于存储积分图的值。
然后,使用sqrIntegral函数计算图像的积分图。
接下来,对于每一行i,对结果进行归一化处理。首先获取一行结果的指针result。
然后,对于每一列j,计算归一化因子s2,并将结果除以tn乘以s2。
以上就是该源代码的分析流程。该程序通过NEON指令优化了模板匹配的计算效率,并实现了对结果的归一化处理
原文地址: https://www.cveoy.top/t/topic/iKN8 著作权归作者所有。请勿转载和采集!