监控的移动追踪,opencv 移动物体检测
前言固定监控需要快速标注全天候画面变化的时间段,使用运动检测的方法。本文主要采用帧差法进行计算。
点跟踪:这种方法通常将连续帧中检测到的物体表示为点。然后引入其他方法来检测目标。该问题可以通过逐帧检测的目标点之间的关系来表示。方法可以分为两类:确定性方法和统计方法。前者通常使用定性的运动限制方法,后者使用目标检测和不确定性建模来建立关联。(1)确定性方法定义了在一系列约束下,在时间t和时间t-1关联图像帧中的每个目标的成本。关联成本的最小化是一个最优组合问题。可以用最优分配法求解,如匈牙利算法和贪婪搜索算法。(2)统计方法在目标状态估计中考虑了观测噪声和模型不确定性,采用状态空间方法对速度、位置、加速度等目标属性进行建模。对于单个目标的情况,可以简单地估计状态;在多目标的情况下,需要在观察域中对应相应的目标。
对于单目标状态估计:如果状态转移矩阵和观测矩阵是线性的,状态和噪声是qsdmt分布,则最优状态估计方法是卡尔曼滤波。这个博客的最终结果也是用卡尔曼滤波器实现的。结果表明,跟踪目标的精度还可以,但目标较多时效果不是很好。
对于多目标状态估计,两种广泛使用的方法是联合概率数据关联滤波(JPDAF)和多假设跟踪(MHT)。
核跟踪:核函数可以是与直方图相关联的矩形或椭圆形模板,通过计算连续帧中的核的运动来跟踪该模板。运动可以是参数形式的平移、旋转或仿射。跟踪的目标表达式通常用原始目标区域来表示,通过计算目标运动来实现跟踪。目标的运动用参数形式的运动来描述(如平移、仿射等。)或计算出的连续帧的密度流面积。这些算法在由外观表示的运动、被跟踪对象的数量以及用于运动估计的方法方面是不同的。核跟踪算法可以分为两类:基于模板和概率密度的外观模型跟踪和基于多视图的外观模型跟踪。
模板匹配是单目标跟踪中最常用的算法
:
。在图像中搜索与预定义模板相似的区域,通过相似性度量(如互相关)判断目标位置。主要问题在于计算量大。可以通过邻域限制等方法减小搜索半径。除了模板匹配,外观模型还可以用颜色直方图、混合模型等表示。多目标跟踪:这种算法通常对整个图像建模,包括背景和每个目标。
多视角外观模型跟踪:从多个视角离线学习目标,以应对大视角变化的跟踪问题。Black和Jepson[1998]提出了一种基于子空间的方法。首先用PCA建立目标外观的子空间表示,然后将图像变换到特征子空间。Avidan [2001]使用SVM分类器对多视角进行分类和跟踪。
轮廓跟踪:基于轮廓的方法提供了更精确的形状描述。该方法的主要思想是利用前一帧建立的目标模型来寻找当前帧的目标区域。目标模型可以是颜色直方图、目标边缘或轮廓。基于轮廓的跟踪方法可以分为两类:形状匹配方法和轮廓跟踪方法。前者在当前帧中搜索目标字符,后者通过状态空间模型或直接能量最小化函数推导出初始轮廓在当前帧中的新位置。
形状匹配法:这种方法类似于基于模板的跟踪,在当前帧中搜索目标的轮廓和相关模型。另一种匹配形状的方法是在两个连续的帧中找到相关联的轮廓,并建立轮廓关联,或轮廓匹配,这是一种类似于点匹配的方法。该方法利用目标的外观特征。轮廓检测通常是通过背景减法来实现的。在提取轮廓之后,通过匹配计算目标模型和每个轮廓之间的距离。该模型可以制作密度函数(颜色或边缘直方图)、轮廓边界、目标边缘或这些信息的组合。
我实现了单目标跟踪的实验结果,主要是利用opencv,qsdmt混合模型中的函数提取前景,经过简单的处理,得到轮廓和质心,这是通过加入卡尔曼函数实现的。网上代码很多,有需要可以提供。
算法的主要流程如下:计算帧间距离(勾股距离),对计算出的距离矩阵应用qsdmt模糊,用一定的阈值进行滤波。如果标准差大于一定阈值,则认为检测到了运动,输出信息将在Python中实现。
运行时环境
编程环境:Python 3.7.6,OpenCV 3.3.0,IDEA
Python实现import numpy为NP import c v2 SD thresh=10 font=cv2 . font _ Hershey _ simple def dist map(frame 1,frame2): 输出两帧之间的勾股距离 frame 1 _ 32=NP . float 32(frame 1)frame 2 _ 32=NP . float 32(frame 2)diff 32=frame 1 _ 32-frame 2 _ 32 norm 32=NP . sqrt(diff 32[:0]**2 diff32[:]0表示第一个摄像头,1表示第二个摄像头,依此类推。VideoCapture(0)_,frame1=cap.read()_,frame 2=cap . read()face count=0 while(True):_,frame3=cap.read() rows,cols,_=NP . shape(frame 3)cv2 . im show( dist ,frame3) dist=distMap(frame1,frame 3)frame 1=frame 2 frame 2=frame 3 #应用高斯平滑mod=cv2。GaussianBlur(dist,(9,9),0) # apply thresholding _,thresh=cv2.threshold(mod,100,255,0) # calculate st dev test _,stDev=cv2 . means tdev(mod)cv2 . imshow( dist ,mod) cv2.putText(frame2,标准差- {} 。format(round(stDev[0][0],0)), (70,70),font,1,(255,0,255),1,cv2。LINE_AA)如果stDev sdThresh: print(检测到运动.做点什么!);cv2.imshow(frame ,frame 2)if cv2 . wait key(1)0x ff==27:break cap . release()cv2 . destroyallwindows()