Introducción detallada al modelo gaussiano
Método general de detección de movimiento
Actualmente, los problemas de detección de objetivos en movimiento se dividen principalmente en dos categorías, cámara fija y cámara en movimiento. Un método bien conocido para resolver el problema de la detección de objetos en movimiento en el movimiento de la cámara es el método de flujo óptico, que predice el estado de movimiento de la cámara resolviendo ecuaciones diferenciales parciales para resolver el campo de flujo óptico de la secuencia de imágenes. Para cámaras fijas, por supuesto, también se puede utilizar el método de flujo óptico, pero debido a la complejidad del método de flujo óptico, a menudo es difícil calcularlo en tiempo real, por lo que utilizo un modelo de fondo gaussiano. Porque, cuando la cámara está fija, el fondo cambia lentamente, afectado principalmente por la luz, el viento, etc. Al modelar el fondo, se separan el primer plano y el fondo de una imagen determinada. En términos generales, el primer plano es un objeto en movimiento, logrando así el propósito de detectar objetos en movimiento.
Modelo de fondo gaussiano de distribución única
El modelo de fondo gaussiano de distribución única cree que para una imagen de fondo, la distribución de brillo de un píxel específico satisface la distribución gaussiana, es decir, el punto B de la imagen de fondo, (x, el brillo de y) satisface IB(x, y) ~ N(u, d). De esta manera, cada atributo de píxel de nuestro modelo de fondo contiene dos parámetros: la media U y la varianza d. Para una imagen dada G, si exp (-(ig (x, y)-u (x, y) )2/. (2 * D2))>t, entonces (x, y) es el punto de fondo, y viceversa. Al mismo tiempo, a medida que cambia el tiempo, la imagen de fondo cambiará lentamente. En este momento, necesitamos actualizar continuamente los parámetros de cada píxel, u (t 1, x, y) = a * u (t, x, y) (1-a) * i (x, y). Aquí, A se denomina parámetro de actualización, lo que significa que el modelo de mezcla gaussiana es un método utilizado para la extracción de fondo. El archivo cvbgfg_gaussmix.cpp en cvaux de OpenCV compila la función del modelo de mezcla gaussiana de acuerdo con el método proporcionado en el documento "Un modelo de mezcla de fondo adaptativo mejorado para el seguimiento de sombras en tiempo real". La clase CvGaussBGModel está definida para almacenar los parámetros del modelo de mezcla gaussiana. Utilizo OpenCV para utilizar la función Modelo de mezcla gaussiana en los siguientes pasos: 1. Se requieren dos funciones, icvUpdateGaussianBGModel e icvReleaseGaussianBGModel, pero estas dos funciones están definidas como funciones internas en el programa fuente y requieren algunas modificaciones. Primero, las declaraciones de las dos primeras funciones en cvbgfg_gaussmix.cpp son static void cv_cdeclicvreleasegsianbgmodel(cvgaussbgmodel * * BG_model); static int CV_CDECL icvupdategaussiangmodel(IPL image *curr_frame, CvGaussBGModel *BG_model comments Suelta dos líneas de código). Luego, en la parte media de cvbgfg_gaussmix.cpp, cambie las partes de definición de las dos funciones, los encabezados de función static int y static void, a cv_implnt y CV_IMPL void.
Finalmente, en el archivo cvaux.h, cvapi(cvbgstatmodel *)cvcreategauss bgmodel(imagen IPL * primer _ fotograma, cvgauss bgstatmodelparams * params * parámetros cv _ default(null)); agregue las dos oraciones siguientes después de esta oración: cv API( void)icvreleaseguaussiangmodel(cvgaussbgmodel * * BG_model); CVAPI (int)icvupdategaussiangmodel (imagen IPL *curr_frame, CvGaussBGModel *BG_model); 2. Defina los parámetros del modelo de mezcla gaussiana en la parte de inicialización del programa CvGaussBGModel * bg _ model = NULL Al leer la imagen del primer cuadro (imagen de fondo), realice el modelado de fondo gaussiano BG _ model = (cvgaussbgmodel *) cvcreateGaussian bgmodel (image, 0); Puede ser una imagen en escala de grises o una imagen en color. A continuación, al leer el fotograma actual, actualice el recuento de regiones del modelo gaussiano = icvupdateGaussian BGModel(curr frame, BG_model); Entiendo que representa la cantidad de áreas de diferentes colores en el fondo. No uso este parámetro, es solo el valor de retorno de la función icvUpdateGaussianBGModel. 3. Ahora bg_model ha guardado los resultados de la clasificación del modelo de mezcla gaussiana, bg_model->background guarda la imagen de fondo y bg_model->foreground guarda la imagen de primer plano.
Incluir ltstdio.h gt# incluir ltcv.h gt# incluir ltcxcore.h gt# incluir lthighgui.h gt# incluir ltcvaux.h gt//Este archivo de encabezado debe estar entre comillas Intmain (Intargc, char * * argv) { Imagen de IPL * p frame = null; IplImage * pFrImg = NULLIplImage * pBkImg = NULLCvCapture * pCapture = NULLint nFrmNum = 0; ( "video ", 30, 0); cvMoveWindow ( "fondo ", 360, 0); cvMoveWindow ( "primer plano ", 690, 0); if (argc gt; 2 ) { fprintf (stderr, " Uso: bk grd[ video _ file _ name]\ n "); return-1; }//Abre el archivo de video if(argc == 2) if(!(p capture = cvCaptureFromFile(argv[1])){ fprintf(stderr, " No se puede abrir el archivo de vídeo s\n ", argv[1]); return-2; }//Abrir cámara if (argc == 1) if (! (p capture = cvCaptureFromCAM(-1)) { fprintf (stderr, " No se puede abrir la cámara.
\ n "); return-2; }//Inicializar los parámetros del modelo de mezcla gaussiana CvGaussBGModel * bg _ model = NULL while(p frame = cvQueryFrame(p capture)){ nfrmnum; if(nFrmNum == 1){ pbk img = cvCreateImage( cvSize(p marco- gt; ancho, p marco- gt; alto), IPL_DEPTH_8U, 3); PFR img = cvCreateImage(cvSize(p marco- gt; ancho, p marco- gt; alto), IPL_DEPTH_8U, 1); / Modelado de fondo gaussiano, pFrame puede ser una imagen multicanal o una imagen de un solo canal // El valor de retorno de la función cvcreateGaussian bgmodel es CvBGStatModel*, // Debe convertirse a cvgaussbgmodel * BG _ model =(cvgaussbgmodel * )cvcreategaussbgmodel(p frame, 0); else {//Actualizar modelo gaussiano cvupdatebgstatmodel (pframe, (cvbgstatmodel *)BG _ model); //pFrImg es la imagen de primer plano y solo puede ser un canal único //pBkImg es la imagen de fondo, que puede ser un solo canal o copia cv(BG_model-gt; primer plano, pFrImg, 0); cv copy(BG_model-gt; fondo, pBkImg, 0 // Mover la imagen hacia adelante pbk img-gt); origen = 1; PFR img- gt; origen = 1; cvShowImage("video ", pFrame); cvShowImage("fondo", pbk img("primer plano", pFrImg); ) desconectar; } }/ /Libera la memoria ocupada por los parámetros del modelo gaussiano cvreleasebgstatemodel((cvbgstatmodel * *); BG_model); cvDestroyWindow(" video "); ; PFR img); cvReleaseImage (amp;pbk img);cvreleasecacapture(amp;p captura);return 0;}