一种基于OpenCV实现的三帧差分运动目标检测算法研究
- 格式:pdf
- 大小:354.91 KB
- 文档页数:4
基于OpenCV的运动目标检测与跟踪的开题报告1.问题描述动态目标检测与跟踪是计算机视觉领域的重要研究方向之一,其应用范围涉及视频监控、智能交通、人机交互等领域。
然而,传统方法对于场景复杂、目标运动快速、遮挡等情况处理效果不佳,需要更高精度、更高效率的算法解决这些问题。
2.研究目标本研究拟使用OpenCV库,运用图像处理、计算机视觉、机器学习等方法,实现运动目标的检测与跟踪,达到以下目标:(1)快速准确地检测运动目标,识别目标的运动轨迹;(2)针对遮挡、光照变化等问题,采用定位、成像、跟踪等多种策略,提高目标检测的精度;(3)针对运动目标的运动速度、方向等多种属性,进行多角度、综合性的分析和研究,建立适用于实际应用的算法。
3.研究方法和技术路线(1)建立视频采集平台。
使用摄像机获取实时视频流,并对数据进行采集、预处理,并应用OpenCV库实现视频流后处理。
(2)建立运动目标检测算法。
运用图像处理算法进行前景/背景分类、形态学滤波等操作,采用一系列特征提取的方法刻画像素点的特征,采用分类器实现目标检测。
(3)针对复杂场景、遮挡等问题,采用多特征、多分类器等方法进行重新整合,进一步提高算法准确度。
(4)建立运动目标跟踪算法。
根据检测结果,利用卡尔曼滤波、粒子滤波等跟踪方法对运动目标进行跟踪。
(5)建立性能评估体系,基于指标和实际应用场景对所研发算法进行综合性评估。
4.预期结果基于OpenCV库进行运动目标检测与跟踪,在实验室实现的基础上,进行测试、优化,结合现有开源算法,最终达到高精度、高效率的运动目标检测与跟踪效果,具体评估指标包括精度、召回率、信噪比等。
同时,根据实际应用场景,通过算法参数的调整,进一步将算法实现优化,使其适用于各种应用场景。
opencv运动检测三帧差法三帧差法优点:实时性高缺点:1、运动物体本身颜色相近时,会出现较大的空洞。
2、无法应对光照骤变的情况理论上:三帧差法比二帧差法更好一些(可在一定程度上消除帧间差分法的“双影”现象),但是也要结合实际情况而用。
1. 帧差法基本原理帧差法的实现非常简单:如图可见,由目标运动引起的运动变化区域,包括运动目标在前后两帧中的共同位置(图中黑色区域)、在当前帧中新显露出的背景区域和新覆盖的背景区域三部分。
数学原理:三帧差法的流程:1 结果1 = (第二幅图像 - 第一幅图像) ∩ (第三幅图像 - 第二幅图像)2结果2 = 滤波(结果1)3 结果3 = 形态学处理(结果2)4结果4 = 二值化(结果3)第一步:第二幅图像减去第一幅图像的值与第三幅图像减去第二幅图像的值作交集运算.对第一步产生的结果做滤波处理.对第二步产生的结果做形态学处理.对第三步产生的结果做二值化处理.直接上代码:1.#include <opencv2/opencv.hpp>ing namespace std;ing namespace cv;4.5.int main()6.{7.//读入视频8.VideoCapture capture("1.avi"); //Laboratory_raw.avi9.//VideoCapture capture(0);10.11.Mat tempframe, currentframe, previousframe, difframe,s3;12.Mat difframe2, difframe3;13.Mat frame;14.int framenum = 0;15.//读取一帧处理16.while (true)17.{18.if (!capture.isOpened())19.{20.cout << "read video failure" << endl;21.return -1;22.}23.//tempframe = capture.read(frame);24.capture >> frame;25.imshow("原视频", frame);26.previousframe = frame.clone(); //第一帧27.28.capture >> frame;29.currentframe = frame.clone(); //第二帧30.31.capture >> frame;32.s3 = frame.clone(); //第三帧33.34.cvtColor(previousframe, previousframe, CV_BGR2GRAY);35.cvtColor(currentframe, currentframe, CV_BGR2GRAY);36.cvtColor(s3,s3, CV_BGR2GRAY);37.38.39.absdiff(currentframe, previousframe, difframe);//做差求绝对值 1-240.absdiff(previousframe, s3, difframe2);//做差求绝对值 2-341.42.43.//准备做与运算,difframe3= difframe2^difframe44.// void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray());//dst = src1 & src245.bitwise_and(difframe, difframe2, difframe3); //46.47.48.threshold(difframe3, tempframe, 20, 255.0, CV_THRESH_BINARY);49.dilate(tempframe, tempframe, Mat());//膨胀50.erode(tempframe, tempframe, Mat());//腐蚀51.52.imshow("运动目标", tempframe);53.54.waitKey(50);55.}//end while56.}运行结果:希望对你有帮助。
【目标追踪】三帧差法原理及实现三帧差法原理及实现•(一)帧差法原理及实现:•(二)帧差法存在的问题:•(三)三帧差法的原理:•(四)三帧差法的实现代码:•(五)视频中的目标追踪效果:(一)帧差法原理及实现:这里可以看一下我的这篇博客,这里就不赘述了:【目标追踪】python帧差法原理及其实现(二)帧差法存在的问题:运动物体本身颜色相近时,会出现较大的空洞。
位置变化缓慢时,难以检测到目标。
对光线非常敏感。
(三)三帧差法的原理:三帧差法的关键是,不再仅仅采用相邻的两帧图片作差查找运动目标,而是在相邻三帧图片的两张帧差图中取“与”操作,即:(四)三帧差法的实现代码:(具体处理和代码解析还是推荐看一下我的上一篇博客:【目标追踪】python帧差法原理及其实现)代码:import cv2import numpy as npfrom nms import py_cpu_nmsfrom time import sleepclass Detector(object):def __init__(self, name='my_video', frame_num=10, k_size=7, color=(0, 255, 0)): = nameself.color = colorself.nms_threshold = 0.3self.time = 1/frame_num # 频率self.es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (k_size, k_size))def catch_video(self, video_index=0, k_size=7,iterations=3, threshold=20, bias_num=1,min_area=360, show_test=True, nms=True,logical='or'):# video_index:摄像头索引(数字)或者视频路径(字符路径)# k_size:中值滤波的滤波器大小# iteration:腐蚀+膨胀的次数,0表示不进行腐蚀和膨胀操作# threshold:二值化阙值# bias_num:计算帧差图时的帧数差# min_area:目标的最小面积# show_test:是否显示二值化图片# nms:是否进行非极大值抑制# logical:三帧差取or或andlogical = logical.lower()if not bias_num > 0:raise Exception('bias_num must > 0')if isinstance(video_index, str):is_camera = False# 如果是视频,则需要调整帧率else:is_camera = Truecap = cv2.VideoCapture(video_index) # 创建摄像头识别类if not cap.isOpened():# 如果没有检测到摄像头,报错raise Exception('Check if the camera is on.')frame_num = 0previous = []while cap.isOpened():catch, frame = cap.read() # 读取每一帧图片if not catch:raise Exception('Unexpected Error.')if frame_num < bias_num:value = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) previous = [value]*bias_numframe_num += 1raw = frame.copy()gray1 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray1 = cv2.absdiff(gray1, previous[0])gray1 = cv2.medianBlur(gray1, k_size)_, mask1 = cv2.threshold(gray1, threshold, 255, cv2.THRESH_BINARY)gray2 = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray2 = cv2.absdiff(gray2, previous[1])gray2 = cv2.medianBlur(gray2, k_size)_, mask2 = cv2.threshold(gray2, threshold, 255, cv2.THRESH_BINARY)if logical == 'or':mask = (np.logical_or(mask1, mask2) + 0)elif logical == 'and':mask = (np.logical_and(mask1, mask2) + 0)else:raise Exception('Logical must be \'OR\' or \'AND\'')mask = (mask * 255).astype(np.uint8)mask = cv2.dilate(mask, self.es, iterations)mask = cv2.erode(mask, self.es, iterations)_, cnts, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)bounds = self.nms_cnts(cnts, mask, min_area, nms=nms)for b in bounds:x, y, w, h = bthickness = (w*h)//min_areathickness = thickness if thickness <= 3 else 3thickness = thickness if thickness >= 1 else 1cv2.rectangle(frame, (x, y), (x+w, y+h), self.color, thickness) if not is_camera:sleep(self.time)cv2.imshow(, frame) # 在window上显示图片if show_test:cv2.imshow(+'_frame', mask) # 边界value = cv2.cvtColor(raw, cv2.COLOR_BGR2GRAY)previous = self.pop(previous, value)cv2.waitKey(10)if cv2.getWindowProperty(, cv2.WND_PROP_AUTOSIZE) < 1:# 点x退出breakif show_test and cv2.getWindowProperty(+'_frame', cv2.WND_PROP_AUTOSIZE) < 1:# 点x退出break# 释放摄像头cap.release()cv2.destroyAllWindows()def nms_cnts(self, cnts, mask, min_area, nms=True):# 对检测到的边界框使用非极大值抑制bounds = [cv2.boundingRect(c) for c in cnts if cv2.contourArea(c) > min_area]if len(bounds) == 0:return []if not nms:return boundsscores = [self.calculate(b, mask) for b in bounds]bounds = np.array(bounds)scores = np.expand_dims(np.array(scores), axis=-1)keep = py_cpu_nms(np.hstack([bounds, scores]), self.nms_threshold)return bounds[keep]def calculate(self, bound, mask):x, y, w, h = boundarea = mask[y:y+h, x:x+w]pos = area > 0pos = pos.astype(np.float)# 得分应与检测框大小也有关系score = np.sum(pos)/(w*h)return scoredef pop(self, l, value):l.pop(0)l.append(value)return lif __name__ == "__main__":detector = Detector(name='test')detector.catch_video('./test.avi', bias_num=2, iterations=1,k_size=5, show_test=True, min_area=360, nms=False) (五)视频中的目标追踪效果:。
OpenCV实现帧间差分法详解本⽂实例为⼤家分享了OpenCV实现帧间差分法的具体⽅法,供⼤家参考,具体内容如下⼀.基本概念基于视频的车辆检测算法种类很多:光流法检测,帧差法,背景消除法(其中包括:直⽅图法,平均值法,单分布和混合⾼斯分布背景模型,Kalman滤波等),边缘检测法,运动⽮量检测法...下⾯分享的是运动⽬标检测算法中最基本的⽅法—帧间差分法。
相邻帧间图像差分思想:检测出了相邻两帧图像中发⽣变化的区域。
该⽅法是⽤图像序列中的连续两帧图像进⾏差分,然后⼆值化该灰度差分图像来提取运动信息。
由帧间变化区域检测分割得到的图像,区分出背景区域和运动车辆区域,进⽽提取要检测的车辆⽬标。
它是通过⽐较图像序列中前后两帧图像对应像素点灰度值的不同,通过两帧相减,如果灰度值很⼩,可以认为该点⽆运动物体经过;反之灰度变化很⼤,则认为有物体经过。
第k帧和k+1帧图像fk(x,y),fk+l(x,y)之间的变化⽤⼀个⼆值差分图像D(x,y)表⽰,如式:⼆值图中0对应前后未变化的地⽅,1对应变化的地⽅。
流程图如下图所⽰:帧差法的特点是实现简单,运算速度快,对于动态环境⾃适应性是很强的,对光线的变化不是⼗分的敏感。
但是在运动体内易产⽣空洞.特别是⽬标运动速度较快时,影响⽬标区域准确提取。
我们以年辆检测为例,车辆检测除了要检测出运动车辆.同时还要检测出暂时停⽌的车辆,在这个⽅⾯,此类⽅法⽆能为⼒。
⽽且如果车辆的体积较⼤,那么车辆在前后帧中根容易产⽣重叠部分,尤其是⼤货车,这使得帧问差分的结果主要为车头和车尾。
车辆中间部分的差分值相对报⼩.形成空洞,不利于检测。
⼆.程序源代码#include "stdafx.h"#include "highgui.h"#include "cxcore.h"#include "ml.h"#include "cv.h"void main(){CvCapture* capture;capture=cvCaptureFromFile("video.avi");//获取视频cvNamedWindow("camera",CV_WINDOW_AUTOSIZE);cvNamedWindow("moving area",CV_WINDOW_AUTOSIZE);IplImage* tempFrame;//⽤于遍历capture中的帧,通道数为3,需要转化为单通道才可以处理IplImage* currentFrame;//当前帧IplImage* previousFrame;//上⼀帧/*CvMat结构,本质上和IplImage差不多,但是因为IplImage⾥的数据只能⽤uchar的形式存放,当需要这些图像数据看作数据矩阵来运算时,0~255的精度显然满⾜不了要求;然⽽CvMat⾥却可以存放任意通道数、任意格式的数据*/CvMat* tempFrameMat;CvMat* currentFrameMat; //IplImage要转成CvMat进⾏处理CvMat* previousFrameMat;int frameNum=0;while(tempFrame=cvQueryFrame(capture)){//tempFrame=cvQueryFrame(capture);frameNum++;if(frameNum==1){//第⼀帧先初始化各个结构,为它们分配空间previousFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U,1);currentFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U,1);currentFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);previousFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);tempFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);//此时这些IplImage和CvMat都是空的,没有存有数据}if(frameNum>=2){cvCvtColor(tempFrame, currentFrame, CV_BGR2GRAY);//转化为单通道灰度图,此时currentFrame已经存了tempFrame的内容 /*⽤cvConvert将IplImage转为CvMat,接下来⽤cvAbsDiff对它们处理经过转换后,currentFrame没有改变,但是tempFrameMat已经存了currentFrame的内容*/cvConvert(currentFrame,tempFrameMat);cvConvert(previousFrame,previousFrameMat);cvAbsDiff(tempFrameMat,previousFrameMat,currentFrameMat);//做差求绝对值/*在currentFrameMat中找⼤于20(阈值)的像素点,把currentFrame中对应的点设为255此处阈值可以帮助把车辆的阴影消除掉*/cvThreshold(currentFrameMat,currentFrame,20,255.0,CV_THRESH_BINARY);//cvConvert(currentFrameMat,currentFrame); //观察不⼆值化的情况cvDilate(currentFrame,currentFrame); //膨胀cvErode(currentFrame,currentFrame); //腐蚀cvFlip(currentFrame, NULL, 0); //垂直翻转//显⽰图像cvShowImage("camera",tempFrame);cvShowImage("moving area",currentFrame);}//把当前帧保存作为下⼀次处理的前⼀帧cvCvtColor(tempFrame, previousFrame, CV_BGR2GRAY);cvWaitKey(33);}//end while//释放资源cvReleaseImage(&tempFrame);cvReleaseImage(&previousFrame);cvReleaseImage(¤tFrame);cvReleaseCapture(&capture);cvReleaseMat(&previousFrameMat);cvReleaseMat(¤tFrameMat);cvDestroyWindow("camera");cvDestroyWindow("moving area");}【注意】代码复制他处,略有改动,进⾏视频输出矫正(源代码昰倒的图像)。
《基于OPENCV的运动目标检测与跟踪技术研究》篇一一、引言随着计算机视觉技术的飞速发展,运动目标检测与跟踪技术已经成为计算机视觉领域研究的热点。
该技术广泛应用于智能监控、交通流量管理、人机交互等众多领域。
OpenCV作为一个强大的计算机视觉库,为运动目标检测与跟踪提供了有效的工具。
本文旨在研究基于OpenCV的运动目标检测与跟踪技术,探讨其原理、方法及实际应用。
二、运动目标检测技术研究1. 背景及原理运动目标检测是计算机视觉中的一项基本任务,其目的是从视频序列中提取出运动的目标。
OpenCV提供了多种运动目标检测方法,如背景减除法、光流法、帧间差分法等。
其中,背景减除法是一种常用的方法,其原理是将当前帧与背景模型进行比较,从而检测出运动目标。
2. 关键技术与方法(1)背景建模:背景建模是运动目标检测的关键步骤。
OpenCV提供了多种背景建模方法,如单高斯模型、混合高斯模型等。
其中,混合高斯模型能够更好地适应背景的动态变化。
(2)阈值设定:设定合适的阈值是运动目标检测的重要环节。
阈值过低可能导致误检,阈值过高则可能导致漏检。
OpenCV通过统计像素值分布,自动设定阈值,从而提高检测的准确性。
3. 实验与分析本文通过实验对比了不同背景建模方法和阈值设定对运动目标检测效果的影响。
实验结果表明,混合高斯模型结合合适的阈值设定能够获得较好的检测效果。
此外,本文还对不同场景下的运动目标检测进行了实验,验证了该方法的稳定性和泛化能力。
三、运动目标跟踪技术研究1. 背景及原理运动目标跟踪是指在视频序列中,对检测到的运动目标进行持续跟踪。
OpenCV提供了多种跟踪方法,如光流法、Meanshift 算法、KCF算法等。
这些方法各有优缺点,适用于不同的场景和需求。
2. 关键技术与方法(1)特征提取:特征提取是运动目标跟踪的关键步骤。
OpenCV可以通过提取目标的颜色、形状、纹理等特征,实现稳定的目标跟踪。
此外,还可以采用深度学习等方法,提取更高级的特征,提高跟踪的准确性。