Logo UADY

Logo_Tec
              
CIMAT Unidad Merida        

conacyt 

PROCESAMIENTO DE VIDEO AGOSTO-DICIEMBRE 2019

Profr: Dr. Francisco Javier Hernández López (fcoj23@cimat.mx)
Enviar tareas al correo: ProcVideo@hotmail.com  (nombre_tarea_# , ej.: FranciscoHernandez_tarea_1)


Temario

Sesión
Tarea
1. Procesamiento de Imágenes
    * Leer Imagen usando MatLab: LeerImagen.m
    * Instalar OpenCVInstalacionBasicaOpenCV.txt
    * Configuración de OpenCV en VStudio C++: OpenCV_PropertyFiles.zip, Pasos. Gracias a: José I. Ucán Ake. 
    * Leer Imagen usando OpenCV: LeerImagen.cpp
    * Convolución usando MatLab: Convolution_matlab.m
    * Convolución usando OpenCV: convolucion.cpp
    * Histograma usando MatLab: Histograma.m, CalculaHistograma.m
    * Histograma usando OpenCV: Histograma.cpp
Tarea_1a_ConversionColor.pdf

Tarea_1a_ModificarImagen.pdf
tenis.bmp

Tarea_1b_CombinacionImagenes.pdf
greenscreen.bmp
greenscreenMask.bmp
fondo.bmp

Tarea_1b_CambiarColor_DeteccionBordes.pdf
pinzas.png
pinzas_gray.png

tarea2.pdf
2. Procesamiento de Video

3. Detección de cambios en un video
    * Aplicando un umbral a una secuencia de video: SimpleUmbral.cpp
    * Simple umbral usando MatLab: SimpleUmbral.m, normalizar.m
    * Video de prueba: pedestrians_290to690.avi
tarea3.pdf
4. Algoritmos de estimación de movimiento
    * Calcular desplazamiento global usando Taylor de primer orden: CalcularDespGlobal_Taylor.m  
    * Implementando POC para calcular un desplazamiento global: PhaseOnlyCorrelation.m, POC.m
    * Flujo Óptico HS y LK en MatLab: OpticalFlow.m
    * Probando función "cv::calcOpticalFlowPyrLK" de OpenCV: FlujoOptico_LK.cpp
    * Video de prueba: office_560to2050.avi
tarea3a_EstimacionMovimiento.pdf
I1.png
I2_1.png
I2_2.png
I2_3.png
I2_4.png

tarea4.pdf
I1.png
I2.png

tarea5.pdf
I1.png
I2.png

5. Substracción de fondo
     * Implementando la substracción de fondo usando el promedio de N frames para la actualización del modelo del BG:
        SubstraccionFondo_BG_promedio.m, Calcular_BG_promedio.m , normalizar.m
     * Videos de prueba: highway_460to869.avi, highway_GT_460to869.avi
     * Evaluando de forma cuantitativa la subtracción de fondo usando Ground Truth: SubstraccionFondo_BG_promedio_ROC.m
tarea6.pdf



6. Substracción de fondo para cámaras en movimiento

7. Segmentación de video (parte 1)
    *Contornos activos usando MatLab: ContornosActivos.m

8. Segmentación de video (parte 2)
tarea7.pdf

9. Seguimiento de objetos en un video
    * Tracking usando características en MatLab: FaceTrackingUsingKLTExample.mFaceTrackingWebcamExample.m
    * Tracking usando histogramas en MatLab: HistogramBasedObjectTracking.m

tarea8.pdf


Calificaciones:

Num. Ctrl.
T1a_ConversionColor
Comentarios   
T1b_CombinacionImagenes
Comentarios
T_1b_CambiarColor_DeteccionBordes
Comentarios
T_3a_EstimacionMovimiento
Comentarios
T4_Exposición
Comentarios
T5
Comentarios
T6
Comentarios
Promedio_T
Examen_I
Proyecto


Tunas
10

10

0
T3_3 0
T3_3 0
T3_3
0
T3_3






Thres
10

8
T6_1 8
T1bCCDB_2
10
T3aEM_1
10

8
T5ROC_1







14016274
10

9
T1bCI_1 8
T1bCCDB_1
0
T3_3 0
T3_3
10








456
0
T3_3
0
T3_3
0
T3_3 0
T3_3 0
T3_3
0
T3_3






123
8
T1_1, T1aCC_1
10

8
T1bCCDB_3
0
T3_3 10

0
T3_3


























2403
10



0
T3_3 0

10

0

3
T6ROC_1





1407
7
T1aCC_2, T1aCC_3


10

0

10

0

0
T3_3




KALIAN18
10
T1aCC_4


10

10

10

10

10






1234
7
T1aCC_2, T1aCC_3, T1aCC_6


9
T1aCC_6 , T1bCCDB_4
9
T3aEM_2 10

10

0
T3_3




1991
10
T1aCC_5


0
T3_3 0

10

8
T5HOM_1
10














































 




Comentarios:
            %Como necesitamos saber cuanto es el total de la sumatoria de los
            %elementos de la matriz, hacemos:
             suma_matriz = matriz(:);
            Esto en MatLab solo te convierte la matriz en un vector, para sumar los elementos te faltó la función sum:
            suma_matriz = sum(matriz(:))

            figure(4);
            [H_I_rst,W_I_rst,~]=size(I_rst);
            I_result=I_rgb;
            I_result(65:65+H_I_rst-1,220:220+W_I_rst-1,:)=I_rst;        
            imshow(I_result);

                                  for(int k=0;k<3;k++)
                                       for(int l=0;l<3;l++){}
                                  deberías cambiarlo por:
                                  for(int k=-1;k<2;k++)
                                       for(int l=-1;l<2;l++){}
                                  y entonces el pixel central sería (i,j) en lugar de (i-1,j-1)       

          for j=1:N
               for i=1:M
                   O(i,j)=T(I2(i,j)+1);
               end
          end
          tu indice $i$ recorre por columnas y tu indice $j$ recorre por renglones, lo cual es un problema cuando tus imágenes no son cuadradas. 

                    for k in range(len(h)-1):
                           h[k+1]+=h[k]                

           El error debe calcularse entre dos ventanas, una centrada en el pixel que estas observando (axisx,axisy) en tu imagen I_kr0
           y otra centrada en el pixel ya con el desplazamiento candidato (kernelx,kernely) en tu imagen I_kr1.

          for d1=-d:d
               for d2=-d:d
                   epsilon(idx)=0;
                   for x1=1:M
                       for x2=1:N
          Y  epsilon(idx)=epsilon(idx)+diferencia*diferencia; 

                      Una forma correcta de evitar el acceso a memoria no asignada es:
                      pos_x_new=i - candidateX;
                      pos_y_new=j - candidateY;
                      if pos_x_new>=0 and pos_x_new<reference_frame.shape[0] and pos_y_new>=0 and pos_y_new<reference_frame.shape[1]:
                                 error =  float(new_frame[i,j]) - float(reference_frame[pos_x_new, pos_y_new])

                      if(l>=0 and l<self.m and k>=0 and k<self.n):
                               er1=er1+self.fi(int(self.im2[i,j])-int(self.im1[l,k]))

                            I1_temp=I1;
                            while(delta>0.0001) %Condicion de paro
                            y en lugar de interpolar con las \deltas, mejor interpola con el vector d=(dx,dy):
                            %I1_new=Interpolar(I1,DeltaD(1),DeltaD(2)); %Interpolo la imagen
                            I1_new=Interpolar(I1_temp,dx,dy); %Interpolo la imagen

                     Calcular primero la suma de los valores de intensidad de N imágenes en un arreglo,
                     después calculas la mediana con: median(BG_mediana, 3), pero como tu arreglo es bidimensional, entonces BG_mediana va a tener la misma información,
                     de esta forma lo que finalmente comparas, es el modelo del fondo calculando el promedio y calculando solo la suma de los N frames.

                      Debería de ser: s(y,x) = B(y,x) - A(y,x) - (dA_x(y,x)*dx) - (dA_y(y,x)*dy);

           if(frame_Gray(j,k) < BG_promedio(j,k) + 20)
               BG_promedio(j,k)=BG_promedio(j,k)+frame_Gray(j,k);
           end
           No hay una explicación acerca de esto en tu reporte, solo se observa que hay huecos negros en tu modelo de fondo promedio.

           k=1;
           for i=ini:fin
               frame_RGB=read(video,i);%escala RGB
               frame_Gray=double(rgb2gray(frame_RGB));%double y gray
               for i_r=1:video.Height
                    for i_c=1:video.Width
                        %BG_mediantemp(i_r,i_c,i) = frame_Gray(i_r,i_c);
                         BG_mediantemp(i_r,i_c,k) = frame_Gray(i_r,i_c);
                    end
                end
                k=k+1;
           end
           Sin embargo, nota que la copia de los frames a tu variable BG_mediantemp, es muy lento, podrías cambiar los dos ciclos internos, por solo la siguiente asignación:
          BG_mediantemp(:,:,k) = frame_Gray(:,:);

          r = (grayVideo - BGmediana).astype(np.double)
          La conversión a double debería de ser antes, por ejemplo:
          r = (grayVideo.astype(np.double) - BGmediana.astype(np.double))


Proyectos:
    Posibles proyectos: ProcesamientoVideo_Proyectos.pdf

   
Bibliografía: