
运动目标的检测的其主要目的是 获取目标对象的运动参数(位置、速度、加速度等)及运动轨迹 ,通过进一步分析处理,实现对目标行为更高层级上的理解。
运动目标检测技术目的是 从序列图像中将变化区域从背景图像中提取出来 ,常用于视频监视、图像压缩、三维重构、异常检测等。
运动目标检测主流方法有帧差法、背景差法、光流法等。光流法源于 仿生学 思想,更贴近于直觉,大量昆虫的视觉机理便是基于光流法。
二十世纪五十年代心理学家Gibson在他的著作“The Perception of Visual World”中首次提出了以心理学实验为基础的光流法基本概念,而直到八十年代才由Horn、Kanade、Lucash和Schunck创造性地将灰度与二维速度场相联系,引入光流约束方程的算法,对光流计算做了奠基性的工作。
光流(optical flow):由于目标对象或者摄像机的移动造成的图像对象在连续两帧图像中的移动。
小球在连续五帧运动构成的光流 小球在连续五帧运动构成的光流通俗说,对于一个序列,把每张图像每个像素在连续帧之间的运动速度和方向( 某像素点在连续两帧上的位移矢量 )找出来就是光流场。
第t帧的时A点的位置是(x1, y1),第t+1帧时A点位置是(x2,y2),则像素点A的位移矢量:(ux, vy) = (x2, y2) - (x1,y1)
如何知道第t+1帧的时候A点的位置涉及到不同的光流计算方法,主要有四种:基于梯度的方法、基于匹配的方法、基于能量的方法、基于相位的方法。
光流法依赖于三个假设:
根据所形成的光流场中 二维矢量的疏密程度 ,光流法可分为稠密光流与稀疏光流。
基于区域匹配生成的稠密光流场 基于区域匹配生成的稠密光流场稀疏光流只对有 明显特征的组点 (如角点)进行跟踪,计算开销小。
基于特征匹配发生成的稀疏光流场 基于特征匹配发生成的稀疏光流场
>
opencv训练自己的模型一般需要两个小时。opencv,AIStudio人工智能学习与实训社区,集合AI教程,代码环境,算法算力和数据集。提供在线云计算编程环境,快速开展深度学习项目。
在本教程中,我们将学习如何基于 Opencv 和 Python 实现对象跟踪。
首先必须明确目标检测和目标跟踪有什么区别:
我们将首先讨论对象检测,然后讨论如何将对象跟踪应用于检测。
可能有不同的应用,例如,计算某个区域有多少人,检查传送带上有多少物体通过,或者计算高速公路上的车辆。
当然,看过本教程后,您会很容易地想到数以千计的想法应用于现实生活或可能应用于工业。
在本教程中,我们将使用 3 个文件:
首先我们需要调用highwaymp4文件并创建一个mask:
正如您在示例代码中看到的,我们还使用了 createBackgroundSubtractorMOG2 函数,该函数返回背景比率(background ratio),然后创建mask。
mask可视化结果:
但是,如您所见,图像中有很多噪点。因此,让我们通过删除所有较小的元素来改进提取,并将我们的注意力集中在大于某个面积的对象上。
使用 OpenCV 的cv2drawContours函数绘制轮廓,我们得到了这个结果。
就本教程而言,分析整个窗口并不重要。我们只对计算在某个点通过的所有车辆感兴趣,因此,我们必须定义一个感兴趣的区域 ROI 并仅在该区域应用mask。
结果可视化如下:
函数 cv2createBackgroundSubtractorMOG2 是在开始时添加的,没有定义参数,现在让我们看看如何进一步改进我们的结果。history是第一个参数,在这种情况下,它设置为 100,因为相机是固定的。varThreshold改为 40,因为该值越低,误报的可能性就越大。在这种情况下,我们只对较大的对象感兴趣。
在继续处理矩形之前,我们对图像进行了进一步的清理。为此,阈值函数就派上用场了。从我们的mask开始,我们告诉它我们只想显示白色或黑色值,因此通过编写254, 255,只会考虑 254 和 255 之间的值。
然后我们将找到的对象的坐标插入到 if 条件中并绘制矩形
这是最终结果:
我们现在只需导入和集成跟踪功能。
一旦创建了对象,我们必须获取边界框的每个位置并将它们插入到单个数组中。
通过在屏幕上显示结果,您可以看到所有通过 ROI 的通道是如何被识别的,以及它们的位置是如何插入到特定的数组中的。显然,识别的摩托车越多,我们的数组就越大。
现在让我们将带有位置的数组传递给trackerupdate()。我们将再次获得一个包含位置的数组,但此外,将为每个对象分配一个唯一的 ID。
从代码中可以看出,我们可以使用 for 循环分析所有内容。此时我们只需要绘制矩形并显示车辆 ID。
在图像中,您可以看到结果
mainpy
从视频中也可以看到,我们已经获得了我们在本教程开始时设置的结果。
但是,您必须将其视为练习或起点,因为关于这个主题有很多话要说,而本教程的目的只是让您了解对象跟踪的原理。
如果你想将 Object Tracking 集成到你的项目中,你应该使用更可靠和先进的对象检测方法,以及跟踪方法。
完整代码地址:私信“333”直接获取或者「链接」
这些代码都解释的这么好了,为什么还需要解释呢。
void CBgCutSystemDlg::DetectObject( IplImage img) //对话框的检测目标的函数
{
CvSize size = cvSize(img->width,img->height); //获取参数img的图像宽高
CvMemStorage stor=NULL; //创建内存空间的指针
IplImage tmp_s=cvCreateImage( size, IPL_DEPTH_8U, 1 ); //创建单通道的8位图像
IplImage curimg=cvCreateImage( size, IPL_DEPTH_8U, 1 ); //创建单通道的8位图像
CvSeq tmp_cont; //创建序列的指针
double timestep = clock()/100; // 定义时间戳
IplImage imgpyr = cvCreateImage( cvSize((sizewidth & -2)/2, (sizeheight & -2)/2), 8, 1 ); //创建imgpyr的图像指针,是降采样的金字塔图像
CvFont font;
cvInitFont(&font,CV_FONT_HERSHEY_DUPLEX ,06f,06f,0,2,CV_AA);
/先进行数据的初始化,取第10帧,因为前面的帧有可能不是背景是黑色的这样更保险,也就是认为10帧以后是正常的/
if( nFrmNum==10 )
{
if (buf)//buf应该是缓存的图像,不知道在哪里定义的,应该是全局的图像指针
cvReleaseImage( &buf); //释放图像
buf = cvCreateImage( size, IPL_DEPTH_8U, 1 ); //重新定义buf为单通道的图像
cvZero( buf ); //清空图像缓存
cvCvtColor( img, buf, CV_BGR2GRAY ); //将传递的图像信息传递给buf,这里才知道img是3通道的彩色图像
} else if(nFrmNum>10) {//如果超过了10帧做什么处理?
以上就是关于opencv常用函数全部的内容,包括:opencv常用函数、视频处理VideoCapture类、运动目标检测——光流法与opencv代码实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)