opencv Matchtemplate遍历原理以及有哪些优化?

风来我也来 风来我也来 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
opencv模板匹配函数的滑动窗口遍历是怎么个过程?看它源代码用了很多傅里叶变换,有点蒙了。有谁知道在优化过程中opencv模板匹配做了那些优化?
我自己写了个匹配函数,注释掉其他部分单纯保留窗口遍历部分耗时是上千秒。
图像是5000*3000规模,模板大小是256*256.
如果直接采用opencv模板匹配函数滑动窗口遍历图片到找到最匹配点也才十几秒。
主要遍历过程见下面(蓝色字体部分):
bool Cacluatesimilarity()
{
int i,j;
if (CircleR>0)
{
int y,step=CircleImage->widthStep;
if (expR==NULL)
{
SetExpR();
}
int inputNum=1;
double *ExpRdata,*TemplateFData,*TemplateData,*TemplateConjugateData,*srcExpRdata,*srcFData,*srcData;
while(inputNum<CircleR)
{
inputNum=inputNum*2;
}
ExpRdata=new double[inputNum*2];
TemplateFData =new double[inputNum*2];
TemplateData =new double[inputNum*2];
TemplateConjugateData =new double[inputNum*2];
srcExpRdata =new double[inputNum*2];
srcFData =new double[inputNum*2];
srcData =new double[inputNum*2];

//计算模板上部分卷积结果
for(i=0;i<CircleR;i++)
{
ExpRdata[2*i]=expR[i].re;
ExpRdata[2*i+1]=expR[i].im;
}
for(i=CircleR;i<inputNum;i++)
{
ExpRdata[2*i]=0.;
ExpRdata[2*i+1]=0.;
}

SetCgRT(Templatehighpoint);
int cheight=CircleImage->height-CircleR*2-1,cwidth=CircleImage->width-CircleR*2-1;
for(i=0;i<cheight;i=i+StepDistance)
{
step=CircleImage->widthStep*i;
for (j=0;j<cwidth;j=j+StepDistance)
{
SetCgR(cvPoint(j,i));//之后进行匹配代码已删除。目的是实现快速圆投影匹配。这边是滑动窗口。具体见下面。 }
}
}
return true;
}



bool SetCgR(CvPoint center)
{
if (CircleR>0)
{
int i,j,r=CircleR*2,y,imagewidth=CircleImage->widthStep;
…………
for (i=0;i<r;i++)
{
y=(center.y+i)*imagewidth;
for (j=0;j<r;j++)
{
CgR[CircleProjection[i][j]] +=(uchar)CircleImage->imageData[y+center.x+j];//CircleProjection是一个存储窗口内各点相对于窗口中心点的半径坐标值。 }
}
}
return true;
}



bool SetCircleProjection()//窗口中的笛卡尔坐标坐标到极坐标映射(只算半径,角度无关所以没计算。)
{
if (CircleR>0)
{
int i,j;
int r=CircleR*2+1,y;
if(CircleProjection!=NULL)
{
for( i=0;i<r;i++)
{
delete[] CircleProjection[i];
}
delete[] CircleProjection;
}
CircleProjection=new int*[r];
for (i=0;i<r;i++)
{
CircleProjection[i]=new int[r];
}
CircleRNumer=0;
for(i=0;i<r;i++)
{
y=(i-CircleR)*(i-CircleR);
for(j=0;j<r;j++)
{
CircleProjection[i][j]=(int)(sqrt(y+(j-CircleR)*(j-CircleR)*1.0)+0.5);
if (CircleProjection[i][j]<=CircleR)
{
CircleRNumer++;
}
}
}
}
return true;
}
...全文

相关推荐

OpenCV模板匹配matchTemplate的实现

作用有局限性,必须在指定的环境下,才能匹配成功,是受到很多因素的影响,所以有一定的适应性 模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题。 它是图像处理中最基本、最常用的匹配方法。 模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域[/code] 工作原理:在待检测图像上,从左到右,从上向下计算模板图像与重叠子图像的匹配度,匹配程度越大,两者相同的可能性越大。 代码实现: import cv2 as

weixin_38676058

OpenCvSharp-MatchTemplate-多目标匹配.rar

OpenCvSharp-MatchTemplate-多目标匹配 完整Demo,可直接运行 VS2010 .net 4.0

天天代码码天天

基于opencv的模板匹配

基于opencv的模板匹配的代码,代码中包含了丰富的注释,非常适合初学者

一瓶可乐zc

Java+opencv3.2.0实现模板匹配

主要为大家详细介绍了Java+opencv3.2.0实现模板匹配的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

weixin_38736562

Python3 OpenCV模板匹配[项目代码]

本文介绍了使用Python3和OpenCV进行模板匹配的基础知识。OpenCV是一个跨平台的计算机视觉库,支持多种编程语言。文章详细讲解了如何读取和显示图像,以及OpenCV中颜色格式的注意事项。重点介绍了cv2.matchTemplate函数和cv2.minMaxLoc函数的使用方法,包括不同的匹配方法及其含义。最后通过一个实战示例,展示了如何在图像中匹配模板并标记出匹配位置。文章还提到下一节将介绍如何匹配多个目标。

Oil88
评论 8
收藏 已收藏
分享
返回顶部