Wir haben seit dem letzten Mal einige Verbesserungen vorgenommen.
Erkennen ähnlicher Videos in Java und OpenCV Version 1 - Qiita
Zusätzlich zum Histogramm werden die Merkmale verglichen. Es gibt verschiedene Algorithmen für die Merkmalsmenge, aber hier verwenden wir den Algorithmus "AKAZE". Ich kenne die Details nicht, aber es scheint von OpenCV3 hinzugefügt worden zu sein, und es sah gut aus (Verschiedenes).
Vor der Verarbeitung in Graustufen konvertieren.
FeatureDetector detector = FeatureDetector.create(FeatureDetector.AKAZE);
DescriptorExtractor executor = DescriptorExtractor.create(DescriptorExtractor.AKAZE);
Mat gray = new Mat();
Imgproc.cvtColor(resizedFrame, gray, Imgproc.COLOR_RGB2GRAY);
MatOfKeyPoint point = new MatOfKeyPoint();
detector.detect(gray, point);
Mat desc = new Mat();
executor.compute(gray, point, desc);
Verwenden Sie als Nächstes Descriptor Matcher, um die erfasste Feature-Menge Mat zu vergleichen. Sie können auch dafür verschiedene Methoden wählen, aber ich bin mir auch nicht sicher, also habe ich BRUTE FORCE gewählt.
DescriptorMatcher macher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE);
MatOfDMatch feature = new MatOfDMatch();
macher.match(video1.getFeatureImg().get(i - 1), video2.getFeatureImg().get(i - 1), feature);
List<Double> distanceList = new ArrayList<>();
for (DMatch dMatch : feature.toList()) {
distanceList.add(Double.valueOf(dMatch.distance));
}
Dieses Mal habe ich beschlossen, die Ergebnisse des Videovergleichs im Durchschnitt zu verarbeiten. Da es sich um "Entfernung" handelt, kann beurteilt werden, dass der kleinere Wert "ähnlich" ist.
Um die Verarbeitungszeit zu verkürzen, haben wir diejenigen mit einem Unterschied in der Wiedergabezeit von mehr als 10% nicht verglichen.
long playtime1 = video1.getPlayTime();
long playtime2 = video2.getPlayTime();
long playtimeDiff = Math.abs(playtime1 - playtime2);
if ((playtimeDiff / playtime1) > 0.1) {
return null;
}
Aufgrund des aktuellen Mechanismus ist dies unvermeidlich, da es nicht möglich ist, Dinge zu vergleichen, die sich auf "enthaltene" Videos beziehen.
Es wurde ein Kontextmenü hinzugefügt, damit Sie die Datei nach Überprüfung des Ergebnisses überprüfen können. So fügen Sie einer TableView ein Kontextmenü hinzu.
ContextMenu menu = new ContextMenu();
MenuItem mi = new MenuItem("Öffnen Sie im Explorer");
mi.setOnAction(event -> {
TableItem item = table.getSelectionModel().getSelectedItem();
String command1 = "explorer /select," + item.getOrg().getVideo1().getFilename();
String command2 = "explorer /select," + item.getOrg().getVideo2().getFilename();
try {
Runtime.getRuntime().exec(command1);
Runtime.getRuntime().exec(command2);
} catch (IOException e) {
e.printStackTrace();
}
});
menu.getItems().add(mi);
table.setContextMenu(menu);
Ausnahmebehandlung ist angemessen ...
Ich konnte "ähnliche Videos" erkennen, indem ich die Histogramme mehr als erwartet verglich. Ich denke, es ist genau genug, um Daten zu erkennen, die sich auf die komprimierten Originaldaten beziehen, wie z. B. Bildrate und Auflösung. Ich frage mich, ob es tiefes Lernen sein wird, wenn es mehr als das wird.
Die nächste Herausforderung ist die nicht funktionierende Seite.
Die Ausführungszeit betrug ungefähr 90 Sekunden für 70 Dateien in einer Umgebung mit Core i5-4690 und 4 GB zugewiesenem Speicher. Ich führe es aus, während ich mir jconsole anschaue, aber der Speicher scheint mit zunehmender Anzahl von Dateien sehr umfangreich zu sein, sodass Raum für Verbesserungen zu bestehen scheint.
Ich arbeite derzeit daran, Ergebnisse zwischenzuspeichern, Histogramme und Funktionen in eine Datei zu schreiben und sie im Speicher zu beenden, aber das funktioniert nicht.
Ich möchte es verbessern.
Das Ende.
Recommended Posts