[PYTHON] Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu

Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu

Nous allons procéder avec le contenu suivant --Lors de l'utilisation du flux optique --Problèmes d'utilisation de 1 Je ne trouve pas les points caractéristiques où je veux --Solution 1 --Problèmes d'utilisation de 2 Lost si vous vous déplacez rapidement

Des images, etc. y sont incluses

Sur l'utilisation du flux optique

le flux optique est une technologie qui détecte et suit les parties caractéristiques d'une image. C'est une technologie très utile, mais lorsque vous l'essayez, vous rencontrez divers problèmes. J'écrirai ici que c'était un peu gênant pour moi à utiliser. En particulier, nous vous présenterons comment trouver les points caractéristiques et que faire si vous les perdez.

Problèmes d'utilisation de 1

Je ne peux pas obtenir un point de fonction où je le veux

S'il y a un endroit caractéristique parce qu'il s'agit d'une méthode pour trouver une partie caractéristique de l'image, l'endroit que vous voulez vraiment peut ne pas être caractérisé. Un exemple est un éclairage puissant.

Solution

Laissez la personne spécifier d'abord l'emplacement du point caractéristique et suivez-le. Par exemple, si vous découpez une partie de l'image comme le code source suivant et détectez les points caractéristiques de l'image, elle aura l'air bien. Un exemple d'algorithme est présenté ci-dessous.

  1. Affichez uniquement la première image de la vidéo et spécifiez la plage dans laquelle vous souhaitez que les points caractéristiques.
  2. Détectez les points caractéristiques dans la plage spécifiée.
  3. Calculez les coordonnées du centre de gravité du point caractéristique détecté (l'image à ce moment est la nième image)
  4. Trouvez le point caractéristique à suivre dans le rayon du centre de gravité calculé en 3 dans la n + 1e image. Si l'image n + 1 de 5,4 est la dernière image de la vidéo, elle se termine. Sinon, passez à 3

Lorsqu'un point caractéristique était détecté comme celui-ci, il était suivi même s'il y avait un fort éclairage dans la vidéo. La source est indiquée ci-dessous, mais comme le code est uniquement extrait, une sorte d'erreur se produira s'il est laissé tel quel.

def extractFeatures(self, gray, rect, features):
    featureList = cv2.goodFeaturesToTrack(gray,100,0.01,10)
    for feature in featureList:
        if rect[0] <= feature[0][0] <= rect[2] and rect[1] <= feature[0][1] <= rect[3]:
            features = self.addList(features, feature[0][0], feature[0][1])
    return features

def featureMouseClicked(self, event, x, y, flags, param):
    if event != cv2.EVENT_LBUTTONDOWN and event != cv2.EVENT_LBUTTONUP:
        return
    if event == cv2.EVENT_LBUTTONDOWN:
        self.rect[0]=x
        self.rect[1]=y
    if event == cv2.EVENT_LBUTTONUP:
        self.rect[2]=x
        self.rect[3]=y
        self.featureRectSet=True

def addList(self,lis,x,y):
    if lis == None:
        lis = np.array([[[x,y]]], np.float32)
    else:
        lis = np.append(lis, [[[x, y]]], axis = 0).astype(np.float32)
    return lis

def cut(img,x,y,width,height):
    ux=0
    uy=0
    dx=0
    dy=0
    if img is None:
        return None,dy,uy,dx,ux
    img_height, img_width = img.shape[:2]
    

    if y+height/2 > img_height:
        uy = img_height
    else:
        uy = y+height/2
    if y-height/2 < 0:
        dy = 0
    else:
        dy = y-height/2

    if x+width/2 > img_width:
        ux = img_width
    else:
        ux = x+width/2
    if x-width/2 < 0:
        dx = 0
    else:
        dx = x-width/2

    if not(dx<ux and dy<uy):
        return None,dy,uy,dx,ux
    if not(0<=ux<=img_width or 0<=dx<=img_width or 0<=uy<=img_height or 0<=dy<=img_height):
        return None,dy,uy,dx,ux
    return img[dy:uy,dx:ux],dy,uy,dx,ux

def nextFrame(self):
    end_flag, Movieframe = self.Moviecap.read()
    #Fin du jugement
    if( Movieframe is None):
        return None

    #Enregistrer l'image actuelle
    self.nowMovieFrame = Movieframe

    #Détection de flux optique
    #Découpez une vidéo avec un rectangle avec une largeur et une hauteur spécifiées autour de la position du point caractéristique précédent, ici la hauteur du rectangle spécifié en premier. C'est la même que la largeur
    mask = np.zeros_like(Movieframe)
    cutFrame,dy,uy,dx,ux= cut(Movieframe,
        int(self.points[len(self.points)-1 - i][0]),#x
        int(self.points[len(self.points)-1 - i][1]),#y
        2*abs(self.rect[1]-self.rect[3]),2*abs(self.rect[0]-self.rect[2]))#
    mask[dy:uy,dx:ux] = cutFrame

    self.grayNext = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
    self.featureNext, status, err = cv2.calcOpticalFlowPyrLK(self.grayPrev, self.grayNext, self.featurePrev, None,
             (dict( winSize  = (15,15),
              maxLevel = 2,
              criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))))
    
    #Sélectionnez les points caractéristiques pour lesquels un flux optique a été détecté (0: non détecté, 1: détecté)
    if status != None:
        goodPrev = self.featurePrev[status == 1]
        goodNext = self.featureNext[status == 1]
        for i, (nextPoint, prevPoint) in enumerate(zip(goodNext, goodPrev)):
                prev_x, prev_y = prevPoint.ravel()
                next_x, next_y = nextPoint.ravel()

    if self.featureNext is None:
        return 0

    #Se préparer au prochain flux optique
    self.grayPrev = self.grayNext.copy()
    self.featurePrev = goodNext.reshape(-1, 1, 2)

    #Renvoie 1 en cas de succès
    return 1


Problèmes d'utilisation de 2

Si un objet avec un point caractéristique se déplace rapidement, vous perdez de vue le point caractéristique.

Si le mouvement est lent, le flux optique le suivra bien, mais si le mouvement est aussi rapide que possible, les points caractéristiques seront perdus. À propos, il peut y avoir une opinion selon laquelle "Si vous vous déplacez rapidement parce que vous avez spécifié la plage dans la solution 1, l'endroit avec le point caractéristique sortira de la plage et vous perdrez de vue le point caractéristique", mais l'état dans lequel vous ne spécifiez pas la plage Cependant, le phénomène de perte de vue des points caractéristiques a été observé.

Solution

En guise de contre-mesure, il existe un moyen d'augmenter le fps autant que possible lors de l'enregistrement d'une vidéo. Cependant, il y a souvent des choses financièrement impossibles. Cette fois, si je perdais de vue les points caractéristiques, je devais arrêter la vidéo et recommencer à partir de la spécification de la plage. Il appelle la fonction nextFrame du code source ci-dessus, met en pause la lecture de la vidéo lorsque 0 est renvoyé, appelle featureMouseClicked et extractFeatures, spécifie à nouveau la plage et lit la vidéo. Peut-être pourrais-je faire plus en générant des images intermédiaires et en augmentant les images par seconde, mais je n'avais pas le pouvoir d'implémenter autant.

Environnement de développement

opencv 2.4.13 python 2.7.11

Recommended Posts

Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
Ce que j'ai fait quand j'étais en colère de le mettre avec l'option enable-shared
Ce que j'ai fait pour garder une trace de l'humidité et de la température des archives
J'ai vectorisé l'accord de la chanson avec word2vec et je l'ai visualisé avec t-SNE
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Quand j'ai gratté le pouce de BOOTH et détecté le visage avec OpenCV, la précision était trop bonne et j'avais peur
J'ai tweeté l'éclairement de la pièce avec Raspberry Pi, Arduino et un capteur optique
Lorsque j'ai essayé de changer le mot de passe root avec ansible, je ne pouvais pas y accéder.
Ce que j'ai fait quand je suis resté coincé dans le délai avec lambda python
Optical Flow, l'image dynamique capturée par OpenCV
Quand j'ai calculé les mots similaires de prudent + courageux avec word2vec, cela me semblait étonnamment raisonnable
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Ce que j'ai fait pour accueillir le Python2 EOL en toute confiance
Trouvez l'écart moyen / standard des valeurs de luminosité dans l'image
Déterminez si la bibliothèque est installée.
Utilisez Pillow pour rendre l'image transparente et en superposer une partie seulement
POSTER l'image avec json et la recevoir avec flask
Renvoyez les données d'image avec Flask of Python et dessinez-les dans l'élément canvas de HTML
J'ai essayé de trouver l'entropie de l'image avec python
Comparez les mots de passe de connexion par hachage avec hashlib de la bibliothèque standard
Que faire lorsqu'une partie de l'image d'arrière-plan devient transparente lorsque l'image transparente est combinée avec Oreiller
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
J'ai comparé la vitesse de Hash avec Topaz, Ruby et Python
Je veux vérifier la position de mon visage avec OpenCV!
Que se passe-t-il lorsque je change les hyper paramètres de SVM (noyau RBF)?
H29.2.27 ~ 3.5 Résumé de ce que j'ai fait
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
[Docker] Que faire en cas d'erreur Impossible de trouver le git binaire apparaît
J'ai défini des variables d'environnement dans Docker et je les ai affichées en Python.
Retrouvez les termes généraux de la séquence de Tribonacci en algèbre linéaire et Python
Un rappel de ce que je suis resté coincé lors du démarrage d'Atcoder avec python
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
Comment enregistrer les informations de point caractéristique de l'image dans un fichier et l'utiliser pour la mise en correspondance
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.