/*
*1)头文件cvaux.h的库文件需要链接到linker. cvaux210d.lib, cvaux210.lib分别是debug和release版本.
* 否则有些函数会出现error:: LINK 2101
*2)cvAdaptiveThreshold, cvThreshold的src和dst图像必须是同类型的单通道图像
*3)重要: 函数退出之后,函数中的动态变量会随着栈的退出全部清空.
* 要保存上次操作的结果,则在函数内声明为静态变量.或者在要调用的函数里先声明
*4)cvAdaptiveThreshold()的处理结果不好,此函数试图找出所有的物体轮廓.用在背景差分中,会找到不想要的物体
*5)当没有前景物体时,OTSU算法会把路面显示出来.因为阈值是自动调整的.解决办法,做一个阈值筛选
*6)VedioControl() 未实现.
* 将cvWaitKey()封装到VedioControl()中, 如果不触发按键,VedioControl()不会退出.造成无法自动播放
*
*Date: 2012/4/6
*Author: Rocky Chen
*/
#include <stdio.h>
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>
#include "cvaux.h"
#include "cxmisc.h"
using namespace std;
void BackgroundDiff(IplImage* SrcImg, IplImage* FroundImg, IplImage* BackgroundImg, int nFrmNum, int threshold_method);
void cvOtsu(IplImage *src, int *thresholdValue);
void PrintVedioInfo(CvCapture* pCapture, IplImage* img);
void VedioControl(); //未实现
//视频控制全局变量,
// 's' 画面stop
// 'q' 退出播放
// 'p' 打印OTSU算法中找到的阈值
char ctrl = NULL;
int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pFrame = NULL;
IplImage* pFroundImg = NULL;
IplImage* pBackgroundImg = NULL;
IplImage* pFroundImg_c = NULL;
IplImage* pBackgroundImg_c = NULL;
//大门背景建模良好 best
// CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\test_video\\gate_11ms_00-30s.avi");
// CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\img_video\\video.short.mjpg.avi");
CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\img_video\\video.long.mjpg.avi");
int nFrmNum = 0;
//创建窗口
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("OTSU foreground",1);
cvNamedWindow("改进的OTSU foreground",1);
//使窗口有序排列
cvMoveWindow("video", 30, 0);
cvMoveWindow("background", 360, 0);
cvMoveWindow("OTSU foreground", 690, 0);
cvMoveWindow("改进的OTSU foreground", 690, 320);
//逐帧读取视频
while(pFrame = cvQueryFrame( pCapture ))
{
nFrmNum++;
//视频控制
if( (ctrl = cvWaitKey(1000/180)) =='s' ) cvWa
*1)头文件cvaux.h的库文件需要链接到linker. cvaux210d.lib, cvaux210.lib分别是debug和release版本.
* 否则有些函数会出现error:: LINK 2101
*2)cvAdaptiveThreshold, cvThreshold的src和dst图像必须是同类型的单通道图像
*3)重要: 函数退出之后,函数中的动态变量会随着栈的退出全部清空.
* 要保存上次操作的结果,则在函数内声明为静态变量.或者在要调用的函数里先声明
*4)cvAdaptiveThreshold()的处理结果不好,此函数试图找出所有的物体轮廓.用在背景差分中,会找到不想要的物体
*5)当没有前景物体时,OTSU算法会把路面显示出来.因为阈值是自动调整的.解决办法,做一个阈值筛选
*6)VedioControl() 未实现.
* 将cvWaitKey()封装到VedioControl()中, 如果不触发按键,VedioControl()不会退出.造成无法自动播放
*
*Date: 2012/4/6
*Author: Rocky Chen
*/
#include <stdio.h>
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>
#include "cvaux.h"
#include "cxmisc.h"
using namespace std;
void BackgroundDiff(IplImage* SrcImg, IplImage* FroundImg, IplImage* BackgroundImg, int nFrmNum, int threshold_method);
void cvOtsu(IplImage *src, int *thresholdValue);
void PrintVedioInfo(CvCapture* pCapture, IplImage* img);
void VedioControl(); //未实现
//视频控制全局变量,
// 's' 画面stop
// 'q' 退出播放
// 'p' 打印OTSU算法中找到的阈值
char ctrl = NULL;
int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pFrame = NULL;
IplImage* pFroundImg = NULL;
IplImage* pBackgroundImg = NULL;
IplImage* pFroundImg_c = NULL;
IplImage* pBackgroundImg_c = NULL;
//大门背景建模良好 best
// CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\test_video\\gate_11ms_00-30s.avi");
// CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\img_video\\video.short.mjpg.avi");
CvCapture* pCapture = cvCreateFileCapture("D:\\C++ Projects\\OpenCV_project\\img_video\\video.long.mjpg.avi");
int nFrmNum = 0;
//创建窗口
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("OTSU foreground",1);
cvNamedWindow("改进的OTSU foreground",1);
//使窗口有序排列
cvMoveWindow("video", 30, 0);
cvMoveWindow("background", 360, 0);
cvMoveWindow("OTSU foreground", 690, 0);
cvMoveWindow("改进的OTSU foreground", 690, 320);
//逐帧读取视频
while(pFrame = cvQueryFrame( pCapture ))
{
nFrmNum++;
//视频控制
if( (ctrl = cvWaitKey(1000/180)) =='s' ) cvWa