概述
harris算法是经典的角点检测算法。对静态的图片进行处理当然消耗内存和时间都非常的短,但是对摄像头采集的每一帧处理就需要花费很大的时间和内存,甚至可能因为内存泄露和空间不足而使电脑奔溃,在这里我运用简单的clock()函数测试各个主要函数的响应时间。
第一步:利用差分算子对图像进行滤波
start = clock();
// cout<<CV_MAT_ELEM(*mat_I,double,200,200)<<endl;
//--------------------------------------------------------------------------
//
//--------------------------------------------------------------------------
//定义水平方向差分算子并求Ix
double dx[9]={-1,0,1,-1,0,1,-1,0,1};
mat_Ix=mbys(mat_I,cxDIB,cyDIB,dx,3,3); //求Ix矩阵
// cout<<CV_MAT_ELEM(*mat_Ix,double,200,200)<<endl;
//定义垂直方向差分算子并求Iy
double dy[9]={-1,-1,-1,0,0,0,1,1,1};
mat_Iy=mbys(mat_I,cxDIB,cyDIB,dy,3,3);//求Iy矩阵
// cout<<CV_MAT_ELEM(*mat_Iy,double,200,200)<<endl;
for(j=0;j<cyDIB;j++)
for(i=0;i<cxDIB;i++)
{
S(pImgDx,i,j)=CV_MAT_ELEM(*mat_Ix,double,j,i);//为相应图像赋值
S(pImgDy,i,j)=CV_MAT_ELEM(*mat_Iy,double,j,i);
}
mat_Ix2=mbxy(mat_Ix,mat_Ix,cxDIB,cyDIB);//计算Ix2,Iy2,Ixy矩阵
mat_Iy2=mbxy(mat_Iy,mat_Iy,cxDIB,cyDIB);
mat_Ixy=mbxy(mat_Ix,mat_Iy,cxDIB,cyDIB);
for(j=0;j<cyDIB;j++)
for(i=0;i<cxDIB;i++)
{
S(pImgDxy,i,j)=CV_MAT_ELEM(*mat_Ixy,double,j,i);//为相应图像赋值
S(pImgDx2,i,j)=CV_MAT_ELEM(*mat_Ix2,double,j,i);
S(pImgDy2,i,j)=CV_MAT_ELEM(*mat_Iy2,double,j,i);
}
finish = clock();
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("%f secondsn",duration);
这段差分算子滤波的函数响应时间可以看到平均大概是60多ms,可以看到响应时间按照处理的速度来说的话很慢了!!!
第二步:对Ix2/Iy2/Ixy进行高斯平滑,以去除噪声
int gausswidth=5;
double sigma=0.8;
double *g=new double[gausswidth*gausswidth];
for(i=0;i<gausswidth;i++)//定义模板
for(j=0;j<gausswidth;j++)
g[i*gausswidth+j]=exp(-((i-int(gausswidth/2))*(i-int(gausswidth/2))+(j-int(gausswidth/2))*(j-int(gausswidth/2)))/(2*sigma));
//归一化:使模板参数之和为1(其实此步可以省略)
double total=0;
for(i=0;i<gausswidth*gausswidth;i++)
total+=g[i];
for(i=0;i<gausswidth;i++)
for(j=0;j<gausswidth;j++)
g[i*gausswidth+j]/=total;
//进行高斯平滑
mat_Ix2=mbys(mat_Ix2,cxDIB,cyDIB,g,gausswidth,gausswidth);
mat_Iy2=mbys(mat_Iy2,cxDIB,cyDIB,g,gausswidth,gausswidth);
mat_Ixy=mbys(mat_Ixy,cxDIB,cyDIB,g,gausswidth,gausswidth);
响应时间可以直接看上图 ,处理速度任然很慢,这里要提到的是这个模板是利用的5*5的高斯模板
第三步:计算角点量
start = clock();
//计算cim:即cornerness of image,我们把它称做‘角点量’
CvMat *mat_cim;
mat_cim=mbcim(mat_Ix2,mat_Iy2,mat_Ixy,cxDIB,cyDIB);
// cout<<CV_MAT_ELEM(*mat_cim,double,cyDIB-1,cxDIB-1)<<endl;
finish = clock();
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("%f secondsn",duration);
计算角点量还是比较快捷,只需要几毫秒,这段程序本身就比较少,不需要做太多改进。
第四步:进行局部非极大值抑制
start = clock();
CvMat *mat_locmax;
const int size=7;
mat_locmax=mblocmax(mat_cim,cxDIB,cyDIB,size);
// cout<<CV_MAT_ELEM(*mat_locmax,double,cyDIB-1,cxDIB-1)<<endl;
finish = clock();
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("%f secondsn",duration);
第五步:获得最终角点
CvMat *mat_corner;
const double thresh=4500;
mat_corner=mbcorner(mat_cim,mat_locmax,cxDIB,cyDIB,gausswidth,thresh);
CvPoint pt;
for(j=size/2;j<cyDIB-size/2;j++)
for(i=size/2;i<cxDIB-size/2;i++)
{
if(CV_MAT_ELEM(*mat_corner,int,j,i)==255){
pt.x=i;
pt.y=j;
cvCircle(dst,pt,2,CV_RGB(255,0,0),1,8,0);
// cout<<i<<" "<<j<<endl;
}
}
运用OPENCV中的函数来求角点
start = clock();
//——————————————————————————---————-------
// 运用OPENCV中的函数来求角点
//------------------------------------------------------------------
double minVal=0.0, maxVal=0.0;
double scale, shift;
double min=0, max=255;
IplImage *preCornerImage32 =cvCreateImage(cvGetSize(pImgGray),IPL_DEPTH_32F ,1);
IplImage *preCornerImage8 =cvCreateImage(cvGetSize(pImgGray),IPL_DEPTH_8U ,1);
cvPreCornerDetect(pImgGray,preCornerImage32,5);//输出是32位
cvMinMaxLoc( preCornerImage32, &minVal, &maxVal, NULL, NULL, 0);
scale = (max - min)/(maxVal-minVal);
shift = -minVal * scale + min;
cvConvertScale( preCornerImage32, preCornerImage8, scale, shift );
IplImage *harrisOutput32 =cvCreateImage
(cvGetSize(pImgGray),IPL_DEPTH_32F ,1);
IplImage *harrisOutput8 =cvCreateImage
(cvGetSize(pImgGray),IPL_DEPTH_8S ,1);
cvCornerHarris(pImgGray,harrisOutput32,3); //输出是32位
cvMinMaxLoc( harrisOutput32, &minVal, &maxVal, NULL, NULL, 0);
scale = (max - min)/(maxVal-minVal);
shift = -minVal * scale + min;
cvConvertScale( harrisOutput32, harrisOutput8, scale, shift );
finish = clock();
duration = (double)(finish-start)/CLOCKS_PER_SEC;
printf("%f secondsn",duration);
响应时间太慢,这段代码需要改进。
如图所示是harris算法对摄像头提取出来的图像做的检测结果。对于计算机的响应时间,几毫秒是比较理想的结果,但是处理速度到100多ms就需要改进。
最后
以上就是爱撒娇含羞草为你收集整理的测试harris算法处理摄像头采集图像的响应时间的全部内容,希望文章能够帮你解决测试harris算法处理摄像头采集图像的响应时间所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复