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.
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 **
ʻ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.