首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

opencv Matchtemplate遍历原理以及有哪些优化?解决办法

2011-12-28 
opencv Matchtemplate遍历原理以及有哪些优化?opencv模板匹配函数的滑动窗口遍历是怎么个过程?看它源代码

opencv Matchtemplate遍历原理以及有哪些优化?
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 一般依靠tbb、ipp之类的加速。要是你机器上没有这些,那就是汇编代码级的优化。
opencv的算法都是大牛写的,会比一般的快。

热点排行