matlab图像平均背景建模,【Opencv手记】平均背景法建模提取前景

news/2024/7/3 19:31:04

#include "highgui.h"

#include "cv.h"

#include "cxcore.h"

/*为不同临时图像和统计属性图像创建指针*/

//三通道float图像

IplImage *IavgF,*IdiffF,*IprevF,*IhiF,*IlowF;

IplImage *Iscratch,*Iscratch2;

//单通道float图像

IplImage *Igray1,*Igray2,*Igray3;

IplImage *Ilow1, *Ilow2, *Ilow3;

IplImage *Ihi1,  *Ihi2,  *Ihi3;

//单通道Byte图像

IplImage *Imaskt;

//自己定义的图像

//IplImage *mypic;

//计算背景建模使用图片的张数

float Icount;

/*调用函数的声明*/

void AllocateImages(IplImage *I);

void accumulateBackground(IplImage * I);

void createModelsfromStats();

void setHighThreshold(float scale);

void setLowThreshold(float scale);

void backgroundDiff(IplImage *I,IplImage * Imask);

void DeallocateImages();

int main(int argc,char** argv)

{

cvNamedWindow("intput",CV_WINDOW_AUTOSIZE);                    //创建输入显示窗口

cvNamedWindow("output",CV_WINDOW_AUTOSIZE);                    //创建输出显示窗口

CvCapture* capture = cvCreateFileCapture("bike.avi");          //返回一个capture指针,指向视频

IplImage*Img = cvQueryFrame(capture);                          //从视频中取出的图片

IplImage*Imask =  cvCreateImage(cvGetSize(Img),IPL_DEPTH_8U,1);//创建输出图片,这里不能去掉cvCreateImage(cvGetSize(Img),IPL_DEPTH_8U,1),虽然我看例程里省略了

AllocateImages(Img);                                           //调用创建临时图片函数

/*累积图像,只取了前30帧图片*/

while(Icount<30){

accumulateBackground(Img);                                   //调用累积图像的函数,循环30次

Img = cvQueryFrame(capture);

cvShowImage("intput",Img);

cvWaitKey(20);

}

createModelsfromStats();                                        //背景建模

while(1)

{

Img = cvQueryFrame(capture);

if(!Img) break;

backgroundDiff(Img,Imask);                                 //根据模型分割前景

cvShowImage("output",Imask);                               //显示图像,视频是一张一张图片连续播放的结果

cvShowImage("intput",Img);

char c = cvWaitKey(33);                                    //当前帧被显示后,等待33ms再读取下一张图片

if(c==27) break;                                           //等待期间按下esc键,ASCII码为27,则循环退出

}

cvReleaseCapture(&capture);

cvDestroyWindow("output");

cvDestroyWindow("intput");

DeallocateImages();

}

/*给需要的所有临时图像分配内存。为了方便,传递一副图像作为大小参考来分配临时图像*/

void AllocateImages( IplImage* I ){

CvSize sz = cvGetSize(I);

IavgF  = cvCreateImage(sz,IPL_DEPTH_32F,3);

IdiffF  = cvCreateImage(sz,IPL_DEPTH_32F,3);

IprevF = cvCreateImage(sz,IPL_DEPTH_32F,3);

IhiF   = cvCreateImage(sz,IPL_DEPTH_32F,3);

IlowF  = cvCreateImage(sz,IPL_DEPTH_32F,3);

Ilow1  = cvCreateImage(sz,IPL_DEPTH_32F,1);

Ilow2  = cvCreateImage(sz,IPL_DEPTH_32F,1);

Ilow3  = cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi1   = cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi2   = cvCreateImage(sz,IPL_DEPTH_32F,1);

Ihi3   = cvCreateImage(sz,IPL_DEPTH_32F,1);

cvZero( IavgF  );

cvZero( IdiffF );

cvZero( IprevF );

cvZero( IhiF   );

cvZero( IlowF  );

Icount = 0.0001;

Iscratch  = cvCreateImage(sz,IPL_DEPTH_32F,3);

Iscratch2 = cvCreateImage(sz,IPL_DEPTH_32F,3);

Igray1    = cvCreateImage(sz,IPL_DEPTH_32F,1);

Igray2    = cvCreateImage(sz,IPL_DEPTH_32F,1);

Igray3    = cvCreateImage(sz,IPL_DEPTH_32F,1);

Imaskt    = cvCreateImage(sz,IPL_DEPTH_8U,1);

cvZero( Iscratch );

cvZero( Iscratch2 );

//mypic    =  cvCreateImage(sz,IPL_DEPTH_8U,1);

}

/*累积背景图像和每一帧图像差值的绝对值*/

void accumulateBackground( IplImage *I ){

static int first = 1;

cvCvtScale( I,Iscratch,1,0);

if( !first ){

cvAcc( Iscratch,IavgF );

cvAbsDiff( Iscratch,IprevF,Iscratch2 );

cvAcc( Iscratch2,IdiffF );

Icount += 1.0;

}

first = 0;

cvCopy( Iscratch,IprevF );

}

/*累积背景图像与每一帧图像差值的绝对值后,建立一个背景的统计模型*/

/*先定义setHighThreshold与setLowThreshold*/

void setHighThreshold( float scale ){

cvConvertScale(IdiffF,Iscratch,scale);

cvAdd( Iscratch,IavgF,IhiF);

cvSplit( IhiF,Ihi1,Ihi2,Ihi3,0);

}

void setLowThreshold( float scale ){

cvConvertScale(IdiffF,Iscratch,scale);

cvSub( IavgF,Iscratch,IlowF);

cvSplit( IlowF,Ilow1,Ilow2,Ilow3,0);

}

/*建立模型*/

void createModelsfromStats(){

cvConvertScale( IavgF, IavgF, (double)(1.0/Icount));         //IgvgF = IgvgF *(1.0/Icount) + 0

cvConvertScale( IdiffF,IdiffF,(double)(1.0/Icount));

cvAddS( IdiffF,cvScalar(1.0,1.0,1.0),IdiffF);

setHighThreshold(7.0);                                       //函数设置一个阈值,使得对于每一帧图像的绝对差大于平局值7倍的像素都认为是前景

setLowThreshold(6.0);

}

/*建立模型同时有了高低阈值,我们就能把图像分割成前景(不能被背景模型“解释”的图像部分)*/

void backgroundDiff(

IplImage *I,

IplImage *Imask

){

cvCvtScale(I,Iscratch,1,0);

cvSplit( Iscratch,Igray1,Igray2,Igray3,0);

//Channel 1

cvInRange(Igray1,Ilow1,Ihi1,Imask);

//Channel 2

cvInRange(Igray2,Ilow2,Ihi2,Imaskt);

cvOr(Imask,Imaskt,Imask);

//Channel 3

cvInRange(Igray3,Ilow3,Ihi3,Imaskt);

cvOr(Imask,Imaskt,Imask);

//cvCvtScale(Imask,mypic,1,0);

cvSubRS( Imask,cvScalar(255),Imask);                              //这里书上例程写cvSubRS(Imask,255,Imask);但是这样编译的时候会报错,必须先转换成cvScalar型

}

/*释放内存*/

void DeallocateImages()

{

cvReleaseImage(&IavgF);

cvReleaseImage(&IdiffF);

cvReleaseImage(&IprevF);

cvReleaseImage(&IhiF);

cvReleaseImage(&IlowF);

cvReleaseImage(&Ilow1);

cvReleaseImage(&Ilow2);

cvReleaseImage(&Ilow3);

cvReleaseImage(&Ihi1);

cvReleaseImage(&Ihi2);

cvReleaseImage(&Ihi3);

cvReleaseImage(&Iscratch);

cvReleaseImage(&Iscratch2);

cvReleaseImage(&Igray1);

cvReleaseImage(&Igray2);

cvReleaseImage(&Igray3);

cvReleaseImage(&Imaskt);

}

许久没有更新博客了,一直觉得自己很菜,没什么可以分享的,也一直在学习中,我用的是学习Opencv这本书,书学到一半多了,最近做了前景提取,用的平均背景法,发现书上例程并不完美的,或许是作者的用心良苦把。学习中遇到的问题我都注释在程序上了。接下来开始做有移动目标前景的背景提取了,然后就是对数据的分析,希望能够早点完成自己想做的功能吧。


http://www.niftyadmin.cn/n/4072836.html

相关文章

LVN与其在Linux上的实现

参考资料&#xff1a; LVM详解-骏马金龙-博客园 How to reduce the size of an LVM partition formatted with xfs filesystem on CentOS7? 骏马兄的博文会相对深入一点&#xff0c;并且他是基于ext系列文件系统来演示扩容与缩容&#xff0c;而我使用的是xfs文件系统。 基本概…

dubbo的一次请求源码分析

调用某个服务首先会进入到动态代理。 InvokerInvocationHandler#invoke(Object proxy, Method method, Object[] args)public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {String methodName method.getName();Class<?>[] parameter…

matlab mwarray,C语言与matlab混合编程中mwArray的Get函数的简单用法解释

网上的通用示例&#xff1a;double data[4] {1.0, 2.0, 3.0, 4.0};double x;mwArray a(2, 2, mxDOUBLE_CLASS);a.SetData(data, 4);x a.Get(1,1); // x 1.0x a.Get(2, 1, 2); // x 3.0x a.Get(2, 2, 2); // x 4.0这个示例我就看得很蛋疼&#xff0c;八成是官方示例(笑)。…

软件外包的五个核心竞争力

国际金融危机的到来&#xff0c;使国内的软件外包企业是几家欢乐几家愁。为什么面对相同的下行市场&#xff0c;各企业的表现却不同呢&#xff1f;这就不得不谈谈企业的核心竞争力。只有搞清什么是自己的核心竞争力&#xff0c;才能从容面对市场风云变幻&#xff0c;使企业走上…

cordova 爬坑指南

cordova 爬坑指南 环境配置 先安装java&#xff0c;配置环境变量&#xff08;百度一下&#xff09;安装sdk&#xff08;建议安装android studio&#xff09;&#xff0c;这里需要要翻墙&#xff0c;或着用站长工具&#xff0c;修改android studio下载地址对应的ip&#xff0c;修…

php提交多个数据库,php – Magento单次提交中的多个数据库事务

我知道如何在zend框架中做到这一点$db->beginTransaction();try {$db->query(...);$db->query(...);$db->query(...);...$db->commit();} catch (Exception $e) {$db->rollBack();}但是我想用magento模型来做这件事$db->beginTransaction();try {$modelOn…

.net 面试题系列文章五(附答案)

18.请叙述属性与索引器的区别。 属性 索引器 通过名称标识。 通过签名标识。 通过简单名称或成员访问来访问。 通过元素访问来访问。 可以为静态成员或实例成员。 必须为实例成员。 属性的 get 访问器没有参数。 索引器的 get 访问器具有与索引器相同的形参表。 属性的 set 访问…

Scrapy 框架 中间件 代理IP 提高效率

中间件 拦截请求跟响应进行ua(User-Agent ) 伪装 代理 IP中间件位置: 引擎 和下载器 中间 的中间件 ( 下载中间件)引擎 跟 spider 中间 的中间件 ( 爬虫中间件)(不常用)下载中间件中的ua 伪装 下载中间件可以拦截调度器发送给下载器的请求。可以将请求的相应信息进行篡改&#…