opecncv之运动物体检测

1)运动物体检测简介
运动物体检测就是在视频(视频文件/摄像头获取)中检测运动物体(目标)。opencv中常用的运动物体检测方法有背景减法,帧差法,光流法,运动物体检测广泛应用于视频安全监控,,车辆检测等方面
背景减法:就是用原图像减去背景模型,剩下的就是前景图像,即运动目标
帧差法:就是利用相邻的两帧或三帧图像,利用像素之间的差异性,判断是否有运动目标
视频就是一帧一帧图像组成的
求图像差异最基本的就是图像减法(-,suntract,absdiff)
- /Subtract —–a-b <0 —0
-Adsdiff —————|a-b|>0

2)背景减法
基本步骤:
原图—背景—-阈值处理—去除噪声(腐蚀 滤波)—膨胀连通—-查找轮廓—-外接矩形(椭圆/圆)
3)帧差法
基本步骤 :
相邻帧相减—阈值处理—-去除噪声(腐蚀滤波)—-膨胀连通—-查找轮廓—-外接矩形(椭圆/圆)

//两张图片的验证
Mat img1=imread("1.bmp");
Mat img2=imread("55.bmp");
imshow("img1",img1);
imshow("img2",img2);
//Mat result=img2.clone();
Mat gray1,gray2;
cvtColor(img1,gray1,CV_BGR2GRAY);
cvtColor(img2,gray2,CV_BGR2GRAY);
Mat diff;
adsdiff(gray1,gray2,diff);
imshow("absdiss",diff);
threshold(diff,diff,45,255,CV_THRESH_BINARY);
imshow("threshold",diff);

Mat element=getStructuringElement(MOORPH_RECT,Size(3,3));
Mat element2=getStructuringElement(MORPH_RECT,Size(11,11));
erode(diff,diff,element);
imshow("erode",diff);

dilate(diff,diff,element2);
imshow("dilate",diff);

vector<vector<Point>contours;
vector<Vec4i>hierarcy;
findContours(diff,contours,hierarcy,CV_RETR_EXTERNAL,CHAIN_APPROX_NONE);//查找轮廓
vector<Rect>boundRect(contours.size());//定义外接矩形集合
drawContours(img2,contours,-1,Scalar(0,0,255),1,8);//绘制轮廓
int xo=0;yo=0;wo=0;ho=0;
for(int i=0;i<contours.size();i++)
{
  boundRect[i]=boundingRect((Mat)contours[i]);//查找每个轮廓的外接矩形
  xo=boundRect[i].x;//获得第i个外接矩形的左上角的x坐标
  yo=boundRect[i].y;//获得第i个外接矩形的左上角的y坐标
  wo=boundRect[i].width;//获得第i个外接矩形的宽度
  ho=boundRect[i].height;//获得第i个外接矩形的高度
  rectangle(img2,Point(xo,yo),Point(xo+wo,yo+ho),Scalar(0,255,0),2,8);//绘制第i个外接矩形
}
imshow("result",img2);
waitKey(0);


视频要可以提取第一帧为背景帧

猜你喜欢

转载自blog.csdn.net/xujaiwei/article/details/75043956