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

/*
 *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
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
背景是一种常用的运动目标检测方之一,也是OpenCV中实现运动目标检测的一种方式。该方通过计算当前帧图像与前一帧图像之间的异来检测出移动的目标物体。 具体实现背景的步骤如下: 1. 读取视频序列或者摄像头实时获取图像帧。 2. 预处理:将图像转换为灰度图像,并进行高斯模糊,以减少声的影响。 3. 初始化背景模型:选择一帧图像作为初始化的背景模型。 4. 计算当前帧与背景之间的异:使用绝对值或者其他分方,计算当前帧图像与背景模型之间的异,并生成异图像。 5. 二值化:将异图像进行二值化处理,将异值大于阈值的像素点标记为前景,表示目标物体的位置。 6. 形态学处理:对二值化后的图像进行开运算、闭运算等形态学处理,去除声或填补目标物体的空洞。 7. 目标检测:根据二值化后的图像,检测出连通区域,判断其是否为目标物体,可以使用轮廓提取或连通区域分析等方。 在OpenCV中,可以使用cv2.createBackgroundSubtractorMOG2()函数创建一个背景器对象,然后使用该对象的apply()方对每一帧图像进行背景分。 例如,可以使用以下代码实现利用背景进行运动目标检测: ```python import cv2 # 创建背景器对象 bg_subtractor = cv2.createBackgroundSubtractorMOG2() # 打开视频文件或者连接摄像头 cap = cv2.VideoCapture("video.mp4") while True: # 读取视频帧 ret, frame = cap.read() # 转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 背景分 fg_mask = bg_subtractor.apply(gray) # 二值化 _, binary = cv2.threshold(fg_mask, 127, 255, cv2.THRESH_BINARY) # 进行形态学处理 # 目标检测 # 显示结果 # 按下Esc键退出 if cv2.waitKey(1) == 27: break # 释放资源 cap.release() cv2.destroyAllWindows() ``` 这是一个简单的实现例子,你可以根据需要进行进一步的改进和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值