运动物体检测

#include "opencv2/opencv.hpp"
#include<iostream>
using namespace std;
using namespace cv;

Mat MoveDetect(Mat frame1, Mat frame2)
{
    Mat result = frame2.clone();
    Mat gray1, gray2;
    cvtColor(frame1, gray1, CV_BGR2GRAY);
    cvtColor(frame2, gray2, CV_BGR2GRAY);

    Mat diff;
    absdiff(gray1, gray2, diff);
    imshow("absdiss", diff);
    threshold(diff, diff, 45, 255, CV_THRESH_BINARY);
    imshow("threshold", diff);
 
    Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
    Mat element2 = getStructuringElement(MORPH_RECT, Size(25, 25));
    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, CV_CHAIN_APPROX_NONE);
    cout<<"num="<<contours.size()<<endl;
    vector<RotatedRect> box(contours.size());
    for(int i=0; i<contours.size(); i++)
    {
        box[i] = fitEllipse(Mat(contours[i]));
        ellipse(result, box[i], Scalar(0, 255, 0), 2, 8);    
        circle(result, box[i].center, 3, Scalar(0, 0, 255), -1, 8);
    }    
    return result;    
}

void main()
{     
    VideoCapture cap("E://man.avi");
    if(!cap.isOpened()) //检查打开是否成功
         return;
    Mat frame;
    Mat result;
    Mat background;
    int count=0;
    while(1)
    {
        cap>>frame;
        if(frame.empty())
            break;
        else{            
            count++;
            if(count==1)
                 background = frame.clone(); //提取第一帧为背景帧
            imshow("video", frame);
            result = MoveDetect(background, frame);
            imshow("result", result);
            if(waitKey(50)==27)
               break;
        }
    }
    cap.release();  
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值