首页 > 编程知识 正文

kcf目标跟踪算法,opencv获取轮廓内所有像素

时间:2023-05-06 14:34:51 阅读:35008 作者:1886

这两天,我在看OpenCV中的跟踪和运动这一部分。 跟踪和运动是个大课题,里面相关的内容有很多。 根据自己的学习进度,简单总结。

在处理视频而不是静止的图像时,我们经常关注屏幕中的一个或多个物体。 对运动物体的关注,往往不是以整个物体为关注对象,而是通过选择几个独特的特征点进行跟踪,引出转角的概念。

(1)专柜

转折点在运动和跟踪的研究中,可以作为跟踪的特征点带来的点被称为转折点。 直观地说,这是一个包含足够信息并可以从当前帧和下一帧中提取的点。

(2)转折点的具体描述

a .与一阶导数局部最大对应的像素点;

b .两条以上边缘的交点

c .图像中梯度值和梯度方向变化速度高点;

d .在角点的一次微分最大,二次微分为0,表示物体边缘变化不连续的方向。

(3) Harris角点检测算法综述

Harris角点检测算子是基于自相关函数给出的,得到矩阵m。 矩阵m中的特征值是自相关函数的一阶曲率,如果一阶曲率都较高,则认为这是特征点。

以下出示图进行直观说明。

图(a )在图像的平滑区域中窗口滑动,窗口在各个方向上没有变化。 图) b )窗口没有沿边缘方向变化。 图) c )窗口向各个方向变化。 此时是转折点。

Harris角点的检测,从一幅图像来看,主要与自相关函数的曲率特性有关。 自相关函数描述了局部图像灰度的变化程度,主要可以表示为:

在本公式中,e是由窗口的平移导致的图像的灰度变化,即,自相关函数,w是窗口,I是图像的灰度。 展开上式如下所示。

其中

对于小偏移:

其中包括:

为了进一步减少噪声,请使用mldzxc窗口进行图像降噪。 mldzxc窗口函数如下:

这样,e可以表示为矩阵。

其中:

为了避免求解m特征值(与m特征值和自相关函数的极值曲率相关),定义:

给出转角的响应函数如下:

上式中的r的值越大,越有可能是角落。

以上想法是Harris提出的响应函数,但后来Shi和Tomasi发现,两个特征值小的大于最小阈值时,可以得到强的角点。

后来,一些学者提出了亚像素角的概念。 通俗地说,以拐角为初始点继续迭代,直到满足预设的迭代阈值条件。 具体请参考相关文献。

在OpenCV中,给出了使用Shi和Tomasi算法的函数cvGoodFeaturesToTrack (),即先计算二次导数,再计算特征值,然后找到小特征值超过最小阈值的角点。

voidcvgoodfeaturestotrack (constcvarr * image,//输入的图像必须是8位或32位单通道图像CvArr* eigImage,CvArr* tempImage //这两个参数都是与输入图像相同的32位单通道图像CvPoint2D32f* corners,//是函数的输出,得到角数组int* corner_count。 //表示可以返回的最大角点数,程序结束后返回的角点数表示doublequality_此参数的默认值为0.1或0.01 double min_distance,//保证角点的距离为此参数的默认值//在计算导数自相关矩阵时指定点附近的int use_harris=0; //如果此参数的值不为0,则在Harris角点定义;如果为0,则在Shi-Tomasi中定义double k=0.4; //Hessian自相关矩阵,即用于设定Hessian行列式相对权重的权重系数。 这里可以回顾上述公式)以下是该程序的完整示例。

# include iostream # include opencv2/opencv.hppusingnamespacestd; # definemax _ corners 100 int main ((intcornerscount=max _ corners; cv point 2d 32 f corners [ max _ corners ]; IplImage *srcImage=0,*grayImage=0,*corners1=0,*corners2=0; int i; cvscalarcolor=cv _ RGB (255,0,0 ); char *filename='3.jpg '; cvnamedwindow('image ',1 ); SRCimage=cvloadimage(filename,1 ); gray image=cvcreateimage (cv getsize (src image ),IPL_DEPTH_8U,1 ); cvcvtcolor(srcimage,grayImage,CV_BGR2GRAY ); //转换为灰度corners1=cvcreateimage (cv getsize (src image ),IPL_DEPTH_32F,1 ); corners2=cvcreateimage (cv getsize (src image ),IPL_DEPTH_32F,1 ); //先绘制两幅图像,在函数中药中加入这两个参数cvgoodfeaturestotrack (gray image,corners1,corners2,corners,cornersCount,0.05,30 if(Cornerscount0) {for ) I=0; I颜色计数; I ) {cvcircle(srcimage,cvpoint ) (int ) ) corners[i].x ),int ) corners[i].y ),2,color,2,cv_ () cvsaveimage(imagedst.png )、srcImage ); cvreleaseimage(srcimage; cvreleaseimage (灰色图像; cvreleaseimage(corners1; cvreleaseimage(corners2; cvwaitkey(0; 返回0; }运行结果如下。

综上所述,虽然基本检测到了拐角,但似乎依然不太理想。 请修改函数cvGoodFeaturesToTrack () )的参数值,并在执行后尝试观察角点检测效果。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。