我是靠谱客的博主 爱撒娇含羞草,最近开发中收集的这篇文章主要介绍测试harris算法处理摄像头采集图像的响应时间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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算法处理摄像头采集图像的响应时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(96)

评论列表共有 0 条评论

立即
投稿
返回
顶部