算法原理


单高斯背景建模_单高斯背景建模




单高斯背景建模_#include_02


单高斯背景建模_matlab_03


Opencv实现


/*******************单高斯背景建模v1.0*************************
************************2010.01.22****************************/

#include <highgui.h>
#include <cv.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    //新建窗口
    cvNamedWindow("origin", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("processing", CV_WINDOW_AUTOSIZE);

    double alpha = 0.05;    //背景建模alpha值
    double std_init = 20;    //初始标准差
    double var_init = std_init * std_init;    //初始方差    
    double lamda = 2.5 * 1.2;    //背景更新参数
	
	char* fileName="E:\\研二上\\video\\highway.AVI";

    //视频文件
    CvCapture *capture = NULL;

//     //读取视频文件
//     if (argc == 1)
//     {
//         //从摄像头读入
//         capture = cvCreateCameraCapture(0);
//     }
//     else if (argc == 2)
//     {
//         //从文件读入
//         capture = cvCreateFileCapture(argv[1]);
//     }
//     else
//     {
//         //读入错误
//         printf("input error\n");
//         return -1;
//     }

	capture = cvCreateFileCapture(fileName);


    IplImage *frame = NULL;        //原始图像
    IplImage *frame_u = NULL;    //期望图像
    IplImage *frame_var = NULL;    //方差图像
    IplImage *frame_std = NULL;    //标准差

    CvScalar pixel = {0};        //像素原始值
    CvScalar pixel_u = {0};        //像素期望
    CvScalar pixel_var = {0};    //像素方差
    CvScalar pixel_std = {0};    //像素标准差

    //初始化frame_u, frame_var, frame_std
    frame = cvQueryFrame(capture);
    frame_u = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
    frame_var = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);
    frame_std = cvCreateImage(cvSize(frame->width, frame->height), IPL_DEPTH_8U, 3);

    for (int y = 0; y < frame->height; ++y)
    {
        for (int x = 0; x < frame->width; ++x)
        {
            pixel = cvGet2D(frame, y, x);

            pixel_u.val[0] = pixel.val[0];
            pixel_u.val[1] = pixel.val[1];
            pixel_u.val[2] = pixel.val[2];

            pixel_std.val[0] = std_init;
            pixel_std.val[1] = std_init;
            pixel_std.val[2] = std_init;

            pixel_var.val[0] = var_init;
            pixel_var.val[1] = var_init;
            pixel_var.val[2] = var_init;

            cvSet2D(frame_u, y, x, pixel_u);
            cvSet2D(frame_var, y, x, pixel_var);
            cvSet2D(frame_std, y, x, pixel_std);
        }
    }

    while (cvWaitKey(33) != 27)        //按ESC键退出, 帧率33ms
    {
        frame = cvQueryFrame(capture);

        //视频结束退出
        if (!frame)
        {
            break;
        }

        //单高斯背景更新
        for (int y = 0; y < frame->height; ++y)
        {
            for (int x = 0; x < frame->width; ++x)
            {
                pixel = cvGet2D(frame, y, x);
                pixel_u = cvGet2D(frame_u, y, x);
                pixel_std = cvGet2D(frame_std, y, x);
                pixel_var = cvGet2D(frame_var, y, x);

                //|I-u| < lamda*std 时认为是背景, 进行更新
                if (fabs(pixel.val[0] - pixel_u.val[0]) < lamda * pixel_std.val[0] &&
                    fabs(pixel.val[1] - pixel_u.val[1]) < lamda * pixel_std.val[1] &&
                    fabs(pixel.val[2] - pixel_u.val[2]) < lamda * pixel_std.val[2])
                {
                    //更新期望 u = (1-alpha)*u + alpha*I
                    pixel_u.val[0] = (1 - alpha) * pixel_u.val[0] + alpha * pixel.val[0];
                    pixel_u.val[1] = (1 - alpha) * pixel_u.val[1] + alpha * pixel.val[1];
                    pixel_u.val[2] = (1 - alpha) * pixel_u.val[2] + alpha * pixel.val[2];

                    //更新方差 var = (1-alpha)*var + alpha*(I-u)^2
                    pixel_var.val[0] = (1 - alpha) * pixel_var.val[0] +
                                    (pixel.val[0] - pixel_u.val[0]) * (pixel.val[0] - pixel_u.val[0]);
                    pixel_var.val[1] = (1 - alpha) * pixel_var.val[1] +
                                    (pixel.val[1] - pixel_u.val[1]) * (pixel.val[1] - pixel_u.val[1]);
                    pixel_var.val[2] = (1 - alpha) * pixel_var.val[2] +
                                    (pixel.val[2] - pixel_u.val[2]) * (pixel.val[2] - pixel_u.val[2]);

                    //更新标准差
                    pixel_std.val[0] = sqrt(pixel_var.val[0]);
                    pixel_std.val[1] = sqrt(pixel_var.val[1]);
                    pixel_std.val[2] = sqrt(pixel_var.val[2]);

                    //写入矩阵
                    cvSet2D(frame_u, y, x, pixel_u);
                    cvSet2D(frame_var, y, x, pixel_var);
                    cvSet2D(frame_std, y, x, pixel_std);
                }
            }
        }

        //显示结果
        cvShowImage("origin", frame);
        cvShowImage("processing", frame_u);
    }

    //释放内存
    cvReleaseCapture(&capture);
    cvReleaseImage(&frame);
    cvReleaseImage(&frame_u);
    cvReleaseImage(&frame_var);
    cvReleaseImage(&frame_std);
    cvDestroyWindow("origin");
    cvDestroyWindow("processing");

    return 0;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.


matlab实现


close all;
clear all;

mov=aviread('E:\研二上\video\highway.AVI'); %读入
fnum=size(mov,2); %读取电影的祯数,mov为1*temp

alpah=0.005;
std_init=20;
var_init=std_init*std_init;
lamda=2.5*2.5;

frame=uint8(ones(304,400,3));
frame_u=frame;
frame_var=frame;
frame_std=frame;


% frame=imread('D:\Code\Data\00011\1.bmp');
frame=mov(1).cdata(:,:,:);
frame_u=frame;
frame_var=var_init*frame_var;
frame_std=std_init*frame_std;


for index=2:fnum
%     fileName=strcat('D:\Code\Data\00011\',int2str(index),'.','bmp'); %将每祯转成jpg的图片
%     frame=imread(fileName);
    frame=mov(index).cdata(:,:,:);
    [x,y,z]=size(frame);
    for i=1:x
        for j=1:y
            frame_rgb=frame(i,j,:);
            frame_u_rgb=frame_u(i,j,:);
            frame_std_rgb=frame_std(i,j,:);
            frame_var_rgb=frame_var(i,j,:);
            if company_rgb(frame_rgb,frame_u_rgb,lamda,frame_std_rgb)
                   frame_u_rgb=(1-alpah).*frame_u_rgb+alpah.*frame_var_rgb;
                   frame_var_rgb=(1-alpah).*frame_var_rgb+alpah.*(frame_rgb-frame_u_rgb).^2;
                               
                   frame_std_rgb=sqrt(double(frame_var_rgb));
            
                   frame_u(i,j,:)= frame_u_rgb;
                   frame_std(i,j,:)=frame_std_rgb;
                   frame_var(i,j,:)=frame_var_rgb;
                   
            end
        end
    end
   
    subplot(2,1,1);
    imshow(frame);
    title('src');
    subplot(2,1,2);
    imshow(frame_u);
    title('result');
    
    pause(0.01);
end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.




function [ output_args ] = company_rgb( frame_rgb,frame_u_rgb,lamda,frame_std_rgb )
%UNTITLED2 Summary of this function goes here
%   Detailed explanation goes here
    var_r=abs(frame_rgb(1)-frame_u_rgb(1));
    var_g=abs(frame_rgb(2)-frame_u_rgb(2));
    var_b=abs(frame_rgb(3)-frame_u_rgb(3));
    if var_r<lamda*frame_std_rgb(1) && var_g<lamda*frame_std_rgb(2) && var_b<lamda*frame_std_rgb(3)
        output_args=1;
    else
        output_args=0;
    end
end
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.