Ich habe nach der obigen Seite gesucht, weil ich die vom Wind geschüttelte Festkommakamera korrigieren wollte. Da ich den Beispielcode jedoch nicht finden konnte, habe ich ihn in Python geschrieben.
Ich behandle keine Fehler. Ich denke auch, dass es in Ordnung ist, weil es funktioniert hat, so dass die Verwendung der wesentlichen Funktion möglicherweise falsch ist.
findTransformECC_test.py
# -*- coding: utf-8 -*-
import cv2
import numpy as np
#Vier CC-Bezeichnung
#fourcc = "DIB "
fourcc = "XVID"
#Spezifikation der Konvertierungsmethode (?)
#warp_type = cv2.MOTION_AFFINE
#warp_type = cv2.MOTION_EUCLIDEAN
#warp_type = cv2.MOTION_TRANSLATION
warp_type = cv2.MOTION_HOMOGRAPHY
#Bild vertikal und horizontal ausgeben 1/2 Größen (Bereich 1)/4) einstellen
scale = 2
#Stellen Sie WarpMatrix und die Konvertierungsfunktion ein
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
#Video eingeben
cap = cv2.VideoCapture(r'./test.mp4')
#Erhalten Sie Erfassungsinformationen und erstellen Sie Ausgabeinformationen
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))
#Holen Sie sich das Referenzbild
ret, base = cap.read()
base = cv2.resize(base, size)
base = cv2.cvtColor(base, cv2.COLOR_BGR2GRAY)
#Ausgabeziel
video1 = cv2.VideoWriter("./out1.avi", cv2.VideoWriter_fourcc(*fourcc), fps, size)
while True:
#Holen Sie sich Rahmen
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)
#Ausgabe ist Originalbild (Farbbild)
out = warpTransform(frame, warp, size)
#Anzeige und Ausgabe an AVI
cv2.imshow("", out)
video1.write(out)
k = cv2.waitKey(1)
if k in [27, ord('q')]:
#Zum Abschluss drücken Sie die ESC- oder Q-Taste
break
#Veröffentlichung
cap.release()
video1.release()
cv2.destroyAllWindows()
** Nachtrag **
Ich habe wrap_type
in warp_type
geändert und es in das Argument von findTransfomrECC
eingefügt.
** Nachtrag zu hier **
Ich kann import cv2.cv
(?) Nicht verwenden. Daher blieb ich beim Ersetzen des Teils der Netzbeispielquelle mit dem cv
-Paket wie cv2.cv.CreateMat
für warpMatrix hängen. ..
warpMatrix Fehlercode
warpMatrix must be single-channel floating-point matrix in function cv::findTransformECC
Es war erfrischend (ich dachte immer, ich hätte einen Float angegeben!), Aber es war einfach, "dtype" anzugeben.
FourCC
Wenn dies auch das Netz ist, könnte ich es nicht nur mit der von `cv2.cv.CV_FOURCC` angegebenen Methode verwenden.
Was wäre, wenn NeoComplete, das ergänzende Plug-In von Vim, mir nicht "VideoWriter_fourcc" sagen würde ...
Ich fand [hier](http://stackoverflow.com/questions/15584608/python-opencv2-cv2-cv-fourcc-not-working-with-videowriterb) später.
# Worüber ich mir immer noch Sorgen mache
――Ich bin der Meinung, dass die Beziehung zwischen dem ersten und dem zweiten Argument von `findTransformECC` das Gegenteil ist.
+ Aber ist es richtig, wenn man das Argument von "warpAffine" berücksichtigt?
# Zusätzlicher Einfallsreichtum
Obwohl die Größe der oben genannten Quelle geändert wird, zielt sie auf das gesamte Bild ab. Wenn ein sich bewegendes Objekt im Video groß erscheint, wird es möglicherweise nicht richtig korrigiert.
Wählen Sie also den Teil des Hintergrunds aus, in dem sich das Bild, das an das 1. und 2. Argument von "findTransformECC" übergeben werden soll, nicht bewegt, und schneiden Sie es wie "base [: 300,:]", "tmp [: 300,:]" zu. ?) Dann hat es sich dramatisch verbessert, wenn ich das Originalbild nur beim Konvertieren mit `warpAffine`,` warpPerspective` verwendet habe.
Wenn Sie ein zugeschnittenes Ausgabevideo verwenden, können Sie die fehlenden Teile außen nicht sehen, wodurch Sie sich gut fühlen.
Wenn Sie es danach einen Tag lang in Ruhe lassen, ist es möglicherweise etwas widerstandsfähiger gegen Zeitänderungen, wenn Sie es auf einer konvertierten Version des vorherigen Frames anstelle des ersten Frames basieren.
Recommended Posts