#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <math.h>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <string>
#include <vector>
#include <fstream> //用于保存监控记录
using namespace std;
int iniBkT=6; //初始背景掩膜判断阈值(影响背景建立速度)
int thrZero=10; //初始背景建成阈值(简单背景时取10,复杂背景取100)
CvRect selection;
int selectionOrigin=1; //为1时,使用默认的监测区域
int select_object = 0;
int detect_object = 0; //等于1时,才开始目标检测
int new_detect_object = 0; //为1时,重新分配内存
unsigned int nFrmNum = 0; //采集的帧数
IplImage *image = NULL; //保存捕捉的视频帧,用于鼠标响应函数
/************************************************************************/
/* 二值化 t1是阈值 */
/************************************************************************/
void threshold(int t1,IplImage* image)
{
for (int i=0;i< image->height;i++) //行
{
for (int j=0;j< image->width;j++) //列
{
uchar t=((uchar*)( image->imageData + image->widthStep*i))[j];
if (t>t1)
((uchar*)( image->imageData + image->widthStep*i))[j]=255;
else
((uchar*)( image->imageData + image->widthStep*i))[j]=0;
}
}
}
/************************************************************************/
/* 初始化为零 */
/************************************************************************/
void setZero(IplImage* image)
{
for(int i=0;i<image->height;i++)
{
for(int j=0;j<image->width;j++)
{
((uchar*)(image->imageData + image->widthStep*i))[j] = 0 ;
}
}
}
int main( int argc, char** argv )
{
CvCapture* pCapture = NULL; //捕捉的视频
IplImage* queryFrame = NULL; //捕捉的视频帧
IplImage* image_gray = NULL; //保存视频帧的灰度图
IplImage* pFrame = NULL; //加检测区域后的视频帧
IplImage* temp = NULL;
IplImage* frameDiff = NULL; //帧差图像
IplImage* pBkImgTemp = NULL;
IplImage* pBkImg = NULL; //背景灰度图
IplImage* pFrImg = NULL; //前景图(先灰度,后二值)
IplImage* pFrImgGray = NULL; //前景灰度图
// IplImage* MO = NULL; //前景部分是灰度
IplImage* pCannyImage1 = NULL;
CvMat* pFrameMat = NULL; //视频帧的灰度矩阵
CvMat* pBkMat = NULL; //前景二值图的矩阵
IplImage* diff = NULL;
int iniBkBuilt =0; //初始背景建成标志
int countZero =0; //统计初始背景掩膜中0的个数
int thresholdT; //前景二值化阈值
double gray=0; //以下4个变量用于计算背景更新速率a
double x=0.0, y=0.0, b=0.0, a=0.0;
int i, j;
IplConvKernel *element9=0;
IplConvKernel *element3=0;
element9=cvCreateStructuringElementEx(9,9,1,1,CV_SHAPE_ELLIPSE,0); //形态学处理模板
element3=cvCreateStructuringElementEx(3,3,1,1,CV_SHAPE_ELLIPSE,0); //形态学处理模板
//创建窗口
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
// cvNamedWindow("foreground_new",1);
cvNamedWindow("object", 1);
// cvNamedWindow("foreground_gray",1);
cvNamedWindow("foregroundorigin",1);
cvNamedWindow("MO",1);
// cvNamedWindow("canny",1);
//使窗口有序排列
cvMoveWindow("video", 0, 0);
cvMoveWindow("background", 400, 0);
//视频采集来源
pCapture = cvCaptureFromAVI((char *)"D:\\高速公路.avi");
while(queryFrame = cvQueryFrame( pCapture ))//cvQueryFrame 函数是 cvGrabFrame 函数和 cvRetrieveFrame函数 的组合调用,直接返回一幅图像
{
if(!image)//首帧的话要初始化
{
image = cvCreateImage(cvGetSize(queryFrame), 8, 3);//cvGetSize得到二维的数组的尺寸,以CvSize返回
image_gray = cvCreateImage(cvGetSize(queryFrame), 8, 1);
}
cvCopy(queryFrame, image);//保存所捕捉的视频帧先输入后输出
cvFlip(image, image);//垂直水平或既垂直又水平翻转二维数组
if(selectionOrigin == 1)//为1时使用默认检测区域
{
selection = cvRect(0, 0, image->width, image->height);//默认检测区域
detect_object = 1; //为1时才开始目标检测
new_detect_object = 1; //为1时重新分配内存
selectionOrigin = 0;//为1时使用默认检测区域
}
cvCvtColor(image, image_gray, CV_BGR2GRAY);//输入输出参数CV_BGR2GRAY 是RGB到gray参数 CV_GRAY2BGR 是gray 到RGB处理结果是彩色的,则转灰色就是了
if(detect_object == 1)//为1时才开始目标检测
{
if( new_detect_object == 1 )//为1时重新分配内存
pFrame = cvCreateImage(cvSize(selection.width, selection.height), 8, 1);//加检测区域后的视频帧
//复制选定检测区域到pFrame中
for(i=selection.y; i<selection.y+selection.height; i++)
for(j=selection.x; j<selection.x+selection.width; j++)
*((uchar *)pFrame->imageData+ (i-selection.y)*pFrame->widthStep+ (j-selection.x)) =
*((uchar *)image_gray->imageData+ i*image_gray->widthStep+ j);
cvRectangle(image, cvPoint(selection.x, selection.y),
cvPoint(selection.x+selection.width, selection.y+selection.height),
cvScalar(255,255,255),2);//对检测区域画白框
nFrmNum++;//采集的帧数
if(nFrmNum == 65535) nFrmNum = 1;
}
cvShowImage("video", image);
//如果初始或重新选定检测区域,需要申请内存,并初始化
if(new_detect_object == 1)
{
new_detect_object = 0;
selectionOrigin = 0;
iniBkBuilt = 0;//初始背景建成标志
temp = cvCreateImage(cvSize(pFrame->width,pFrame->height), IPL_DEPTH_8U,1);//创建图像头并分配数据无符号8位整型数
frameDiff = cvCreateImage(cvSize(pFrame->width,pFrame->height), IPL_DEPTH_8U,1); //帧间差分图像
pBkImgTemp = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); //初始背景掩膜
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); //初始背景图像
setZero(pBkImgTemp);//将数组中所有元素置0
setZero(pBkImg); //初始背景全部置0
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); //前景图像
pFrImgGray = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1); //前景灰度图
// MO = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pCannyImage1 = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1); //视频输入帧的矩阵形式
pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);//背景矩阵
//初始化temp,用于帧差法求初始背景
cvCopy(pFrame, temp);//拷贝给temp
cvSmooth(temp, temp, CV_GAUSSIAN, 3, 0, 0, 0);//图像的平滑第一个是输入图像第二是输出图像
continue;
}
//
if(nFrmNum%1==0 && nFrmNum>0)//初始背景建立和运动目标检测时每3帧进行一次处理
{
/************************************************************************/
//初始背景的建立
if(iniBkBuilt ==0)//初始背景建成标志//背景还未建成
{
printf("%d ",nFrmNum);
cvSmooth(pFrame, pFrame, CV_GAUSSIAN, 3, 0, 0, 0);//高斯平滑当前帧
cvAbsDiff(pFrame, temp, frameDiff);//最后一个是输出计算两个数组差的绝对值
//初始背景建立
int i,j;
for(i=0; i<pFrame->height; i++)
{
for(j=0; j<pFrame->width; j++)
{
if(((uchar*)(frameDiff->imageData + frameDiff->widthStep*i))[j] <= iniBkT &&
((uchar*)(pBkImgTemp->imageData + pBkImgTemp->widthStep*i))[j]==0)
{
((uchar*)(pBkImgTemp->imageData + pBkImgTemp->widthStep*i))[j]=1; //满足条件掩膜设为1//背景初始化为第一帧
}
}
}
cvErode(pBkImgTemp, pBkImgTemp, element9, 1); //使用任意结构元素腐蚀图像,腐蚀背景掩膜,除去噪声
//输入输出,用于腐蚀的结构元素,若为NULL,则使用3*3的长方形结构元素,1是腐蚀次数
for(i=0; i<pFrame->height; i++)
{
for(j=0; j<pFrame->width; j++)
{ /* 腐蚀之后,如果背景掩膜为1,且背景为0,更新背景图像 */
if(((uchar*)(pBkImgTemp->imageData + pBkImgTemp->widthStep
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
opencv车辆检测是在夜间进行检测.rar (27个子文件)
Matlab实现无约束条件下普列姆(Prim)算法.docx 14KB
DEMO
DEMO.dsw 537B
DEMO.dsp 4KB
DEMO.plg 925B
~VC30B.tmp 0B
StdAfx.cpp 295B
DEMO.opt 48KB
StdAfx.h 769B
DEMO.cpp 10KB
Debug
阴影消除.exe 260KB
StdAfx.obj 2KB
DEMO.pdb 585KB
DEMO.ilk 383KB
DEMO.sbr 668KB
DEMO.obj 47KB
阴影消除.ilk 396KB
DEMO.pch 199KB
vc60.idb 241KB
DEMO.exe 244KB
StdAfx.sbr 4KB
StdAfx.cpp 295B
阴影消除.pch 199KB
vc60.pdb 212KB
StdAfx.h 769B
阴影消除.pdb 585KB
DEMO.ncb 57KB
~VC30A.tmp 512B
共 27 条
- 1
资源评论
阿里matlab建模师
- 粉丝: 3305
- 资源: 2784
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功