因为是在运动情况下检测入侵物体
以前静态情况下的背景建模没办法进行
而我们拥有原有视频和入侵后的视频
因此首先我们进行图像匹配(使用了shift特征)shift代码太多了,就不贴出来了。
之后进行背景差
从而检测出前景改变后的物体
之后利用OPencv中团块检测的功能
检测出前景物体
原理很简单,就当练手了
代码如下:
//#include <fstream>
//#include <string>
#include <cv.h>
#include <highgui.h>
#include <ml.h>
//#include <iostream>
//#include <fstream>
//#include <string>
//#include <vector>
#include <cvaux.h>
//#include <iostream>
//#include <stdio.h>
//#include <string.h>
//#include <ctype.h>
using namespace cv;
//using namespace std;
int DetectNewBlob(IplImage* pImg, IplImage* pFGMask, CvBlobSeq* pNewBlobList, CvBlobSeq* pOldBlobList);
void cvText(IplImage* img,char* text,int x,int y)
{
CvFont font;
double hscale = 1.0;
double vscale = 1.0;
int linewidth = 2;
cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX | CV_FONT_ITALIC,hscale,vscale,0,linewidth);
CvScalar textColor =cvScalar(255,0,0);
CvPoint textPos =cvPoint(x, y);
cvPutText(img, text, textPos, &font,textColor);
}
int main()
{
int i = 0;
IplImage* ImageOrigain;
IplImage* ImageChange;
CvCapture* captureOrigain;
CvCapture* captureChange;
captureOrigain = cvCaptureFromFile("D:\\My Documents\\Visual Studio 2008\\Projects\\TrainTest\\Origain.avi");
captureChange = cvCaptureFromFile("D:\\My Documents\\Visual Studio 2008\\Projects\\TrainTest\\change.avi");
while(i<500)
{
ImageOrigain = cvQueryFrame(captureOrigain);
ImageChange = cvQueryFrame(captureChange);
IplImage* tempImageO = cvCreateImage(cvSize(ImageOrigain->width,ImageOrigain->height),IPL_DEPTH_8U,1);
IplImage* tempImageC = cvCreateImage(cvSize(ImageOrigain->width,ImageOrigain->height),IPL_DEPTH_8U,1);
IplImage* resultImage = cvCreateImage(cvSize(ImageOrigain->width,ImageOrigain->height),IPL_DEPTH_8U,1);
cvCvtColor(ImageOrigain,tempImageO,CV_RGB2GRAY);
cvCvtColor(ImageChange,tempImageC,CV_RGB2GRAY);
cvSub(tempImageO,temp