<jupyter_start><jupyter_text>INF6804 Vision par ordinateurPolytechnique MontréalExemple de suivi avec par filtres de particules.<jupyter_code>import cv2  
import os
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
import random as ran<jupyter_output><empty_output><jupyter_text>Fonction pour calculer la similarité entre 2 histogrammes.<jupyter_code>def CompareParticles(hist1, hist2):
    return 1 - cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA)<jupyter_output><empty_output><jupyter_text>Fonction qui calcule l'histogramme d'une image à l'intérieur d'un rectangle englobant.<jupyter_code>def CalcHisto(image, bbox):
    roi = (bbox[0], bbox[1], bbox[0]+bbox[2], bbox[1]+bbox[3])
    mask = np.zeros((image.shape[0],image.shape[1]), np.uint8)
    cv2.rectangle(mask,(roi[0],roi[1]),(roi[2],roi[3]),255,-1,8,0);
    return cv2.calcHist([image1],[0],mask,[64],[0,256])<jupyter_output><empty_output><jupyter_text>Fonction pour générer des particles selon la méthode d'échantillonnage préférentiel (importance sampling).<jupyter_code>def GenererParticules(Particules, nbparticules, mvt = 20 , poids = None):
    if len(Particules)==1:
        #Pour générer les particules initiales. Pas de poids disponible
        #Déplacement aléatoire de ROI initial de [-mvt, mvt]
        NouvParticules = Particules
        for i in range(1,nbparticules):
            part = [(Particules[0][0]+ran.randint(-mvt,mvt), Particules[0][1]+ran.randint(-mvt,mvt), Particules[0][2], Particules[0][3])]
            NouvParticules = NouvParticules + part
    else:
        # Échantillonage préférentiel avec la fonction ran.choices()
        temp = ran.choices(Particules,poids)[0]
        # Mise à jour de leur état en ajoutant une translation en X et Y.
        part = [(temp[0]+ran.randint(-mvt,mvt), temp[1]+ran.randint(-mvt,mvt), temp[2], temp[3])]
        NouvParticules = part
        for i in range(1,nbparticules):
            temp = ran.choices(Particules,poids)[0]
            part = [(temp[0]+ran.randint(-mvt,mvt), temp[1]+ran.randint(-mvt,mvt), temp[2], temp[3])]
            NouvParticules = NouvParticules + part
    return NouvParticules<jupyter_output><empty_output><jupyter_text>Lecture de deux images tests et affichage.<jupyter_code>image_name = 'in000216.jpg'
if not os.path.exists(image_name):
  !gdown https://raw.githubusercontent.com/gabilodeau/INF6804/master/images/in000216.jpg
  !gdown https://raw.githubusercontent.com/gabilodeau/INF6804/master/images/in000219.jpg
  !gdown https://raw.githubusercontent.com/gabilodeau/INF6804/master/images/in000222.jpg
  !gdown https://raw.githubusercontent.com/gabilodeau/INF6804/master/images/in000225.jpg
image1 = cv2.imread('in000216.jpg',cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('in000219.jpg',cv2.IMREAD_GRAYSCALE) 
f, axarr = plt.subplots(1, 2, figsize=(15,15))
axarr[0].imshow(image1,cmap = plt.get_cmap('gray'))
axarr[1].imshow(image2,cmap = plt.get_cmap('gray'))
plt.show()<jupyter_output><empty_output><jupyter_text>Définition du rectangle englobant (bbox) de la région d'intérêt (ROI).<jupyter_code># Pour suivre une des trois personnes
bbox = (279, 120, 36, 120)
#bbox = (83, 300, 70, 160)
#bbox = (547, 90, 45, 100)
fig,ax = plt.subplots(1)
ax.imshow(image1,cmap = plt.get_cmap('gray'))
rect = patches.Rectangle((bbox[0],bbox[1]),bbox[2],bbox[3],linewidth=2,edgecolor='r',facecolor='none')
ax.add_patch(rect)
plt.show()<jupyter_output><empty_output><jupyter_text>Définition des paramètres et calcule de l'histogramme de l'objet à suivre. Génération des particules initiales et affichage.<jupyter_code>nbpart = 20  #Nombre de particules
mouvement = 40  #Déplacement max en X et Y
modele = CalcHisto(image1, bbox) 
particules= GenererParticules([bbox],nbpart, mouvement)
fig,ax = plt.subplots(1,figsize=(10,10))
ax.imshow(image1,cmap = plt.get_cmap('gray'))
for p in particules:
    rect = patches.Rectangle((p[0],p[1]),p[2],p[3],linewidth=2,edgecolor='r',facecolor='none')
    ax.add_patch(rect)
plt.show()<jupyter_output><empty_output><jupyter_text>Suivi: Évaluation des particules + choix de la meilleur pour la nouvelle position de l'objet.<jupyter_code>poids =[]
for p in particules:
    candidat = CalcHisto(image2, p)
    dist = CompareParticles(modele, candidat) 
    poids.append(dist)
    
fig,ax = plt.subplots(1)
ax.imshow(image2,cmap = plt.get_cmap('gray'))
p = particules[poids.index(max(poids))]
rect = patches.Rectangle((p[0],p[1]),p[2],p[3],linewidth=2,edgecolor='r',facecolor='none')
ax.add_patch(rect)
plt.show()<jupyter_output><empty_output><jupyter_text>Suivi sur deux autres trames...<jupyter_code>image3 = cv2.imread('in000222.jpg',cv2.IMREAD_GRAYSCALE) 
particules = GenererParticules(particules,nbpart, mouvement, poids)
poids =[]
for p in particules:
    candidat = CalcHisto(image3, p)
    dist = CompareParticles(modele, candidat)
    poids.append(dist)
    
fig,ax = plt.subplots(1)
ax.imshow(image3,cmap = plt.get_cmap('gray'))
p = particules[poids.index(max(poids))]
rect = patches.Rectangle((p[0],p[1]),p[2],p[3],linewidth=2,edgecolor='r',facecolor='none')
ax.add_patch(rect)
plt.show()
image4 = cv2.imread('in000225.jpg',cv2.IMREAD_GRAYSCALE) 
particules = GenererParticules(particules, nbpart, mouvement, poids)
poids =[]
for p in particules:
    candidat = CalcHisto(image4, p)
    dist = CompareParticles(modele, candidat)
    poids.append(dist)
    
fig,ax = plt.subplots(1)
ax.imshow(image4,cmap = plt.get_cmap('gray'))
p = particules[poids.index(max(poids))]
rect = patches.Rectangle((p[0],p[1]),p[2],p[3],linewidth=2,edgecolor='r',facecolor='none')
ax.add_patch(rect)
plt.show()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.1481153778092373, 'fraction_numerical': 0.04158556007786233, 'mean_word_length': 5.859223300970874, 'pattern_counts': {'":': 0, '<': 37, '<?xml version=': 0, '>': 37, 'https://': 4, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '531665', 'license': 'MIT', 'n_tokens_mistral': 2340, 'n_tokens_neox': 2254, 'n_words': 374, 'path': 'Particlefiltertracker.ipynb', 'repo_name': 'gabilodeau/INF6804', 'size': '5651'}