Faites en sorte que les vidéos floues ressemblent à des caméras à point fixe avec Python et OpenCV

Ancienne histoire

Une histoire sur la vidéo de tremblement de caméra corrigée comme une caméra à point fixe OpenCV | Digital Creative Super Software Tokyo

Je l'ai cherché parce que je voulais corriger la caméra à point fixe qui était secouée par le vent, et j'ai trouvé le site ci-dessus. Cependant, je n'ai pas pu trouver l'exemple de code, alors je l'ai écrit en Python.

Ce que j'ai utilisé

code

Je ne gère aucune erreur. De plus, je pense que ça va parce que cela a fonctionné, donc l'utilisation de la fonction essentielle peut être incorrecte.

findTransformECC_test.py


# -*- coding: utf-8 -*-
import cv2
import numpy as np

#Désignation quatre CC
#fourcc = "DIB "
fourcc = "XVID"

#Spécification de la méthode de conversion (?)
#warp_type = cv2.MOTION_AFFINE
#warp_type = cv2.MOTION_EUCLIDEAN
#warp_type = cv2.MOTION_TRANSLATION
warp_type = cv2.MOTION_HOMOGRAPHY

#Image de sortie verticalement et horizontalement 1/2 tailles (zone 1)/4) ensemble
scale = 2

#Définir WarpMatrix et la fonction de conversion
if warp_type == cv2.MOTION_HOMOGRAPHY:
    warp = np.eye(3,3,dtype=np.float32)
    warpTransform = cv2.warpPerspective
else:
    warp = np.eye(2,3,dtype=np.float32)
    warpTransform = cv2.warpAffine

#Vidéo d'entrée
cap = cv2.VideoCapture(r'./test.mp4')

#Obtenez des informations de capture et créez des informations de sortie
fps = cap.get(cv2.CAP_PROP_FPS)
size = cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
size = tuple(map(lambda x: int(x / scale), size))

#Obtenez l'image de référence
ret, base = cap.read()
base = cv2.resize(base, size)
base = cv2.cvtColor(base, cv2.COLOR_BGR2GRAY)

#Destination de sortie
video1 = cv2.VideoWriter("./out1.avi", cv2.VideoWriter_fourcc(*fourcc), fps, size)

while True:

    #Obtenir le cadre
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.resize(frame, size)
    tmp = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.findTransformECC(tmp, base, warp, warp_type)

    #La sortie est l'image d'origine (image couleur)
    out = warpTransform(frame, warp, size)

    #Affichage et sortie vers AVI
    cv2.imshow("", out)
    video1.write(out)

    k = cv2.waitKey(1)
    if k in [27, ord('q')]:
        #Terminez en appuyant sur la touche ESC ou Q
        break

#Libération
cap.release()
video1.release()
cv2.destroyAllWindows()

** Addenda ** J'ai changé wrap_type en warp_type et l'ai mis dans l'argument de findTransfomrECC. ** Addendum ici **

Où ça va

ʻImport cv2.cv ne peut pas être utilisé (?), Il convient donc lors du remplacement de la partie de la source de l'échantillon net en utilisant le package cv, tel que cv2.cv.CreateMat` pour warpMatrix. ..

warpMatrix Code d'erreur

warpMatrix must be single-channel floating-point matrix in function cv::findTransformECC


 C'était rafraîchissant (j'ai toujours pensé que j'avais spécifié un float!), Mais c'était facile de spécifier `dtype`.

 FourCC
 Si c'est aussi le net, je ne pourrais pas l'utiliser uniquement par la méthode spécifiée par `cv2.cv.CV_FOURCC`.
 Et si NeoComplete, un plug-in complémentaire pour Vim, ne me disait pas `VideoWriter_fourcc` ...
 J'ai trouvé [ici](http://stackoverflow.com/questions/15584608/python-opencv2-cv2-cv-fourcc-not-working-with-videowriterb) plus tard.

# Ce qui m'inquiète toujours
 «Je pense que la relation entre le premier et le deuxième arguments de« findTransformECC »est le contraire.
 + Mais est-ce correct compte tenu de l'argument de `warpAffine`?

# Ingéniosité supplémentaire
 Bien que la source ci-dessus soit redimensionnée, elle couvre toute l'image, donc si un objet en mouvement semble grand dans la vidéo, il peut ne pas être corrigé correctement.

 Donc, sélectionnez la partie de l'arrière-plan où l'image à passer aux 1er et 2ème arguments de `findTransformECC` ne bouge pas, et recadrez (découpez) comme` base [: 300 ,:]`, `tmp [: 300 ,:]`. ?) Ensuite, cela s'est considérablement amélioré si j'utilisais l'image d'origine uniquement lors de la conversion avec `warpAffine`,` warpPerspective`.

 Si vous utilisez une vidéo de sortie recadrée, vous ne pourrez pas voir les parties manquantes à l'extérieur, ce qui vous fera vous sentir bien.

 Après cela, si vous le laissez seul pendant une journée, il peut être un peu plus résistant aux changements d'heure si vous le basez sur une version convertie de l'image précédente au lieu de la première image.


Recommended Posts

Faites en sorte que les vidéos floues ressemblent à des caméras à point fixe avec Python et OpenCV
Briller la vie avec Python et OpenCV
Réseau neuronal avec OpenCV 3 et Python 3
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Capturer des images avec Pupil, python et OpenCV
Fractal pour faire et jouer avec Python
Créez diverses vidéos Photoshop avec Python + OpenCV ③ Créez diverses vidéos Photoshop
Hello World et détection de visage avec OpenCV 4.3 + Python
Rechercher et télécharger automatiquement des vidéos YouTube avec Python
Rendre OpenCV3 disponible à partir de python3 installé avec pyenv
Correspondance des fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)
[# 1] Créez Minecraft avec Python. ~ Recherche préliminaire et conception ~
Binarisation avec OpenCV / Python
[# 2] Créez Minecraft avec Python. ~ Dessin du modèle et implémentation du lecteur ~
Essayez de créer un jeu simple avec Python 3 et iPhone
Créez diverses vidéos Photoshop avec Python + OpenCV ④ Traitez les problèmes
Ubuntu 20.04 sur raspberry pi 4 avec OpenCV et utilisation avec python
Créez diverses vidéos Photoshop avec Python + OpenCV ② Créez une image fixe Photoshop
[Python] Taille d'image de la caméra Web et paramètres FPS avec OpenCV
Créez des tweets ordinaires comme une flotte avec AWS Lambda et Python
Chargement / affichage et accélération de gif avec python [OpenCV]
Associez Python Enum à une fonction pour la rendre appelable
Analysez les actions avec python et recherchez des phases de trading favorables
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
"Traitement Apple" avec OpenCV3 + Python3
Python et matériel - Utilisation de RS232C avec Python -
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
[Python] Utilisation d'OpenCV avec Python (basique)
Faites une loterie avec Python
Rendre Opencv disponible en Python
Détection de visage avec Python + OpenCV
Utiliser OpenCV avec Python @Mac
Fonctionne avec Python et R
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
Créez une application de scraping avec Python + Django + AWS et modifiez les tâches
Jetez quelque chose dans Kinesis avec python et assurez-vous qu'il est dans
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
Communiquez avec FX-5204PS avec Python et PyUSB
Créez un bot LINE avec Python + heroku
Installez Python 2.7.9 et Python 3.4.x avec pip.
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
Modulation et démodulation AM avec python
Créer Apache Log CSV avec Python
Scraping avec Node, Ruby et Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Faisons une interface graphique avec python.
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python