// objectdet.cpp : 定义控制台应用程序的入口点。
//
//*******************************************************************************
//运动区域检测(背景差分法)
//*******************************************************************************
#include "stdafx.h" //C++库文件
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <cv.h> //opencv库文件
#include <cxcore.h>
#include <highgui.h>
int main( int argc, char** argv )
{
//声明IplImage指针和CvMat矩阵,并初始化
IplImage* pFrame = NULL; //当前全景图像获取
IplImage* pBkImg = NULL; //作为背景
IplImage* pFrImg = NULL; //作为运动前景
IplImage* pCannyImg = NULL; //作为边缘检测后的图像
CvMat* pFrameMat = NULL; //当前全景矩阵
CvMat* pBkMat = NULL; //背景矩阵
CvMat* pFrMat = NULL; //运动前景矩阵
//创建窗口并使窗口有序排列
cvNamedWindow("测试视频",CV_WINDOW_AUTOSIZE); //创建名为video的窗口,1表示以显示图像的窗口大小会自动调整以适合被显示图像
cvNamedWindow("背景",1); //背景窗口
cvNamedWindow("运动前景",1); //运动前景视频窗口
cvNamedWindow("边缘检测canny",1);
cvMoveWindow("测试视频", 50, 0); //设定video窗口的位置,窗口左上角的x坐标为30,窗口左上角的y坐标为0
cvMoveWindow("背景", 410, 0);
cvMoveWindow("运动前景", 50, 320);
cvMoveWindow("边缘检测canny", 410, 320);
//固定路径的视频文件读入
CvCapture* pCapture = NULL;
int nFrmNum = 0; //帧数
pCapture = cvCaptureFromFile("OneLeaveShop2cor.mpeg"); //调用cvCaptureFromFile()从camera.avi文件中读取视频,并返回CvCapture结构体类型指针
//如果什么也没获取到,则提示无法打开
if( !pCapture )
{
fprintf(stderr, "Can not open video file %s\n");
return -2;
}
//逐帧读取视频,对帧图像进行处理
while(pFrame = cvQueryFrame( pCapture )) //函数cvQueryFrame()从文件中抓取一帧,然后解压并返回这一帧
{
nFrmNum++;
//如果是第一帧,需要申请内存,并初始化
if(nFrmNum == 1)
{
//调用函数cvCreateImage()创建头并分配数据,图像元素的位深度为无符号8位整型,每个像素通道数为1
pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
pCannyImg = cvCreateImage(cvSize(pFrame->width, pFrame->height), IPL_DEPTH_8U,1);
//函数cvCreateMat()为新的矩阵分配头和下面的数据,并且返回一个指向新创建的矩阵的指针
pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);
//利用颜色空间转换函数cvCvtColor()将获得的帧图像转化成单通道图像再处理
cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
cvCvtColor(pFrame, pCannyImg, CV_BGR2GRAY);
//把IplImage转为矩阵,进行更自由的计算
cvConvert(pFrImg, pBkMat);
cvConvert(pFrImg, pFrameMat);
cvConvert(pFrImg, pFrMat);
}
else //不是第一帧时
{
cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);
cvConvert(pFrImg, pFrameMat);
//【1】先进行高斯滤波,以去除噪声平滑图像
cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 3, 0, 0); //(中值滤波CV_MEDIAN)对图像进行核大小为 param1×param2 的高斯卷积
//【2】计算两个数组差的绝对值,实现当前帧跟背景图相减,得到运动区域
cvAbsDiff(pFrameMat, pBkMat, pFrMat);
//【3】二值化前景图,对灰度图像进行阈值操作得到二值图像,阈值为60
cvThreshold(pFrMat, pFrImg, 30, 255.0, CV_THRESH_BINARY);
//【4】进行形态学滤波,去掉噪音
for(int i=0;i<=0;i++)
{ cvDilate(pFrImg, pFrImg, 0, 2); //膨胀
cvErode(pFrImg, pFrImg, 0, 3); //腐蚀
cvDilate(pFrImg, pFrImg, 0, 1); //膨胀
}
//【5】采用canny算法对图像进行边缘检测,第一个阈值50, 第二个阈值150,算子内核大小3
cvCanny(pFrImg, pCannyImg, 50, 150, 3);
////【6】找到轮廓并填充
//CvMemStorage* storage = cvCreateMemStorage(0);
//CvSeq * contours;
//cvFindContours(pCannyImg,storage,&contours,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
// void cvDrawContours( CvArr *pCannyImg, CvSeq* contour, CvScalar external_color, CvScalar hole_color,int max_level, int thickness=1,int line_type=8, CvPoint offset=cvPoint(0,0) );
//更新背景,移动平均,(1-alpha)*acc(x,y)+alpha*image(x,y) =>acc(x,y)
cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);
//将背景转化为图像格式,用以显示
cvConvert(pBkMat, pBkImg);
//显示图像
cvShowImage("测试视频", pFrame);
cvShowImage("背景", pBkImg);
cvShowImage("运动前景", pFrImg);
cvShowImage("边缘检测canny", pCannyImg);
int key=cvWaitKey(100000);
if (key==27)
{//esc
break;
}
}
}
//销毁窗口
cvDestroyWindow("测试视频");
cvDestroyWindow("背景");
cvDestroyWindow("运动前景");
cvDestroyWindow("边缘检测canny");
//释放图像和矩阵
cvReleaseImage(&pBkImg);
cvReleaseImage(&pFrImg);
cvReleaseImage(&pCannyImg);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pBkMat);
cvReleaseMat(&pFrMat);
cvReleaseCapture(&pCapture);
system("pause");
return 0;
}
object-dect.zip_opencv背景差分
版权申诉
31 浏览量
2022-09-20
20:30:19
上传
评论
收藏 3KB ZIP 举报
朱moyimi
- 粉丝: 61
- 资源: 1万+
最新资源
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
- 以下是一个简化的示例,它使用pygame库来模拟烟花动画的框架.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈