QT + Opencv 实现灰度模板匹配
实现思路
1.模板创建代码思路
1 初始化和准备:
使用 cv::buildPyramid 函数构建图像金字塔。图像金字塔是一种多分辨率表示,每个层级的图像分辨率逐步降低。
调整 m_TemplData 的大小以匹配图像金字塔的层级数。
计算每个层级的统计数据:
2遍历图像金字塔的每个层级。
计算当前层级图像的倒数面积 invArea,用于后续的归一化处理。
使用 cv::meanStdDev 函数计算当前层级图像的均值 templMean 和标准差 templSdv。
计算模板图像的归一化范数 templNorm,这是模板图像的归一化标准差的平方和。
检查 templNorm 是否小于 DBL_EPSILON,如果是,表示当前层级图像的方差接近于零,将其标记为 vecResultEqual1 为 true。
计算 templSum2,这是 templNorm 加上均值的平方和,然后除以 invArea。
计算 templNorm 的平方根,并归一化。
将计算得到的 invArea、templMean 和 templNorm 存储到 m_TemplData 中对应的位置。
模板训练代码:
//训练模板
void frmTemplateMatch::LearnPattern(const cv::Mat model, const int num_levels,s_TemplData &m_TemplData)
{
qDebug()<<"train mode...";
m_TemplData.clear();
cv::buildPyramid(model, m_TemplData.vecPyramid, num_levels);
int iSize = m_TemplData.vecPyramid.size();
m_TemplData.resize(iSize);
for (int i = 0; i < iSize; i++)
{
double invArea = 1. / ((double)m_TemplData.vecPyramid[i].rows * m_TemplData.vecPyramid[i].cols);
cv::Scalar templMean, templSdv;
double templNorm = 0, templSum2 = 0;
cv::meanStdDev(m_TemplData.vecPyramid[i], templMean, templSdv);
templNorm = templSdv[0] * templSdv[0] + templSdv[1] * templSdv[1] + templSdv[2] * templSdv[2] + templSdv

最低0.47元/天 解锁文章
9439

被折叠的 条评论
为什么被折叠?



