视频中用图形框起运动物体
代码拷贝http://blog.csdn.net/u011630458/article/details/45895649,我在其中将圆形框注释掉,换成矩形框。代码如下:
// moving detection.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include "opencv2/core/core.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/legacy/legacy.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
using namespace cv;
int main(int argc, char** argv){
Mat frame, fgmask, segm, find_shape;
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
Ptr<BackgroundSubtractorGMG> fgbg = Algorithm::create<BackgroundSubtractorGMG>("BackgroundSubtractor.GMG");
if (fgbg.empty()){
std::cerr << "Failed to create BackgroundSubtractor.GMG Algorithm." << std::endl;
return -1;
}
fgbg->set("initializationFrames", 20);
fgbg->set("decisionThreshold", 0.7);
VideoCapture cap;
cap.open("C:\\Users\\Administrator\\Desktop\\数据\\chuli\\chuli\\car.avi");
if (!cap.isOpened()){
std::cerr << "Cannot read video. Try moving video file to sample directory." << std::endl;
return -1;
}
namedWindow("detection", WINDOW_NORMAL);
for (;;){
if (!cap.read(frame)){
break;
}
(*fgbg)(frame, fgmask);
frame.copyTo(segm);
IplImage ImaskCodeBook = fgmask;
cvSegmentFGMask(&ImaskCodeBook);
fgmask.copyTo(find_shape);
findContours(find_shape, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
//vector<vector<Point> > contours_poly( contours.size());
vector<Rect>boundRect(contours.size());
//vector<Point2f>center( contours.size());
//vector<float>radius( contours.size());
for( int i = 0; i < contours.size(); i++){
boundRect[i]=boundingRect( Mat(contours[i]));
//approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true);//绘制曲线逼近多边形
//minEnclosingCircle( contours_poly[i], center[i], radius[i]);//圆形
}
for(int i = 0; i< contours.size(); i++ ){
rectangle(segm,boundRect[i].tl(),boundRect[i].br(), Scalar(255, 0, 0), 2, 8, 0);
//circle(segm, center[i], (int)radius[i], Scalar(100, 100, 0), 2, 8, 0);
}
imshow("detection", segm);
// imshow("mask", fgmask);
int c = waitKey(30);
if (c == 'q' || c == 'Q' || (c & 255) == 27)
break;
}
return 0;
}