Erkennen Sie ähnliche Videos in Java und OpenCV Version 2

Wir haben seit dem letzten Mal einige Verbesserungen vorgenommen.

Erkennen ähnlicher Videos in Java und OpenCV Version 1 - Qiita

Bildvergleich ändern

Vergleich nach Merkmalsmenge

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.

Vergleich nach Wiedergabezeit

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.

Andere Änderungen

Öffnen Sie den Explorer über die Ergebnisse

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

abschließend

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.

Referenz

Recommended Posts

Erkennen Sie ähnliche Videos in Java und OpenCV Version 2
Erkennen Sie ähnliche Videos in Java und OpenCV Version 3
Erkennen Sie ähnliche Videos in Java und OpenCV Version 1
Verwenden Sie OpenCV mit Java
Beispiel für Codierung und Decodierung in Java
StringBuffer- und StringBuilder-Klasse in Java
Verstehe gleich und hashCode in Java
Java + OpenCV 3.X mit IntelliJ IDEA
Hallo Welt in Java und Gradle
Unterschied zwischen final und Immutable in Java
Ich habe die OpenCV-Kamerakalibrierung in Java durchgeführt
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Programmieren Sie PDF-Kopf- und Fußzeilen in Java
Lernen Sie Flyweight-Muster und ConcurrentHashMap in Java
Die Richtung von Java in "C ++ Design and Evolution"
Von Java nach C und von C nach Java in Android Studio
Lesen und Schreiben von GZIP-Dateien in Java
Unterschied zwischen int und Integer in Java
Diskriminierung von Enum in Java 7 und höher
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Verwenden Sie OpenCV_Contrib (ArUco) mit Java! (Teil 1-Build) (OpenCV-3.4.4)
Parallele und parallele Verarbeitung in verschiedenen Sprachen (Java Edition)
Unterschied zwischen next () und nextLine () in Java Scanner
Unterschiede beim Schreiben von Java-, C # - und Javascript-Klassen
Erfassen und speichern Sie die Selen-Installation in Java
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
[Java] Verstehe in 10 Minuten! Assoziatives Array und HashMap
Unterscheiden Sie in Java zwischen positiven und negativen Zahlen
Java fügt Wasserzeichen in Word-Dokumenten hinzu und entfernt sie
Repräsentiert "nächster Tag" und "vorheriger Tag" in Java / Android
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Laden Sie Notizen in Java auf S3 hoch und laden Sie sie herunter
Verschlüsseln / Entschlüsseln mit AES256 in PHP und Java
Generieren Sie OffsetDateTime aus Clock und LocalDateTime in Java
Partisierung in Java
Änderungen in Java 11
Janken in Java
Java und JavaScript
XXE und Java
Umfangsrate in Java
FizzBuzz in Java
[Android / Java] Bildschirmübergang und Rückgabeverarbeitung in Fragmenten
Konvertieren Sie JSON und YAML in Java (mit Jackson und SnakeYAML)
Versuchte Mastodons Toot- und Streaming-API in Java
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Organisieren Sie Builds in C ++ / Java- und Win / Linux-Kombinationen
Vektorisieren und bildgeben Sie handgeschriebene numerische MNIST-Bilddaten mit Java
Schreiben Sie eine Klasse in Kotlin und nennen Sie sie in Java
[Java] Unterschied zwischen statischem final und final in Mitgliedsvariablen
In der Abbildung verstandene Java-Klassen und -Instanzen
Java-Join- und Split-Tabellenzellen im Word-Dokument
Dies und das zum Bearbeiten von ini in Java. : inieditor-java
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
Subtrahieren Sie Enum-Konstanten von Zeichenfolgen und Werten in Java zurück
Verwendung von Abstract Class und Interface in Java richtig