Lecture centre gravité bulles open CV

Bonjour,

Nous travaillons sur un projet de mécanique des fluides, nous analysons des videos .mov de montée de bulles de champagne, nous avons un code python qui track et affiche grâce a open CV la trajectoire des bulles.

Nous aimerions récupérer le nombre de bulles prises en compte ainsi que leur centre de gravité. Pouvez vous nous aider ?

Voici le code python :

import numpy as np
import cv2

cap = cv2.VideoCapture('/Users/jonbiran/Documents/TER/800.mov')
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 25.0, (1280,720))

# params for ShiTomasi corner detection
feature_params = dict( maxCorners = 100,
                       qualityLevel = 0.3,
                       minDistance = 7,
                       blockSize = 7 )

# Parameters for lucas kanade optical flow
lk_params = dict( winSize  = (15,15),
                  maxLevel = 2,
                  criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

# Create some random colors
color = np.random.randint(0,255,(100,3))

# Take first frame and find corners in it
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params)

# Create a mask image for drawing purposes
mask = np.zeros_like(old_frame)

while(1):
    ret,frame = cap.read()
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # calculate optical flow
    p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

    # Select good points
    good_new = p1[st==1]
    good_old = p0[st==1]

    # draw the tracks
    for i,(new,old) in enumerate(zip(good_new,good_old)):
        a,b = new.ravel()
        c,d = old.ravel()
        mask = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2)
        frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
    img = cv2.add(frame,mask)

    cv2.imshow('frame',img)
    k = cv2.waitKey(300) & 0xff
    if k == 100 :
        break

    # Now update the previous frame and previous points
    old_gray = frame_gray.copy()
    p0 = good_new.reshape(-1,1,2)

cv2.destroyAllWindows()
out.release()
cap.release()


Merci pour votre aide

2 réponses

  1. Modérateur
    Bonjour,

    Sans la vidéo c'est difficile de tester et de s'assurer de ce que fait le code, mais j'ai l'impression que le nombre de bulle est juste
    len(good_new)
    et les centres de gravités sont
    [new.ravel() for new in good_new]
    .

    Bonne chance
    0
    1. Bonjour,
      Donc nous avons juste a créer deux variables ctr_gravite = [new.ravel() for new in good_new] et nbr_bulle = len(good_new) à la fin du code et d'afficher ces deux variables ?
      A chaque fois le code plante vers la fin de la vidéo, ce qui empêche la lecture des variables.
      0
  2. Modérateur
    Bonjour,

    Il faudrait voir l'erreur. Ensuite si tu ne peux pas créer la boucle tu peux
    print(len(good_new))
    et
    print(new.ravel())
    dans ta boucle
    while
    pour voir si les valeurs te paraissent cohérentes.

    Bonne chance
    0