opencv 背景差分法 改进OTSU阈值去噪

该博客介绍了如何利用OpenCV的背景差分法结合OTSU阈值处理来提高视频中前景物体检测的准确性。作者指出,cvAdaptiveThreshold()在背景差分中可能产生不理想的结果,而OTSU算法在没有前景物体时可能会错误地标记背景。为了解决这些问题,提出了阈值筛选的方法,并提供了C++代码示例进行说明。
摘要由CSDN通过智能技术生成
/*
 *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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值