Détecter des vidéos similaires dans Java et OpenCV rev.2

Nous avons apporté des améliorations depuis la dernière fois.

Détection de vidéos similaires en Java et OpenCV rev.1 --Qiita

Modifier la comparaison d'images

Comparaison par quantité de fonctionnalités

En plus de l'histogramme, les caractéristiques sont comparées. Il existe différents algorithmes de quantité de caractéristiques, mais ici nous utiliserons quelque chose appelé "AKAZE". Je ne connais pas les détails, mais il semble avoir été ajouté à partir d'OpenCV3, et cela avait l'air bien (divers).

Conversion en échelle de gris avant le traitement.

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);

Ensuite, utilisez Descriptor Matcher pour comparer la quantité de caractéristiques acquise Mat. Vous pouvez également choisir plusieurs méthodes pour cela, mais je n'en suis pas sûr non plus, j'ai donc choisi BRUTE FORCE.

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));
}

Cette fois, j'ai décidé de gérer les résultats de comparaison vidéo en moyenne. Puisqu'il s'agit de "distance", on peut juger que la valeur la plus petite est "similaire".

Comparaison par temps de lecture

Dans le but de réduire le temps de traitement, nous n'avons pas comparé ceux avec une différence de temps de lecture de plus de 10%.

long playtime1 = video1.getPlayTime();
long playtime2 = video2.getPlayTime();
long playtimeDiff = Math.abs(playtime1 - playtime2);
if ((playtimeDiff / playtime1) > 0.1) {
	return null;
}

En raison du mécanisme actuel, il est inévitable car il n'est pas possible de comparer des éléments liés aux vidéos "incluses".

Autres changements

Ouvrir l'explorateur à partir des résultats

Ajout d'un menu contextuel pour que vous puissiez vérifier le fichier après avoir vérifié le résultat. Voici comment ajouter un menu contextuel à un TableView.

ContextMenu menu = new ContextMenu();
MenuItem mi = new MenuItem("Ouvrir dans l'explorateur");
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);

La gestion des exceptions est appropriée ...

en conclusion

J'ai pu détecter des "vidéos similaires" simplement en comparant les histogrammes plus que prévu. Je pense qu'il est suffisamment précis pour détecter les données liées aux données originales compressées, telles que la fréquence d'images et la résolution. Je me demande si ce sera un apprentissage en profondeur si cela devient plus que cela.

Le prochain défi est le côté non fonctionnel.

Le temps d'exécution était d'environ 90 secondes pour 70 fichiers dans un environnement avec Core i5-4690 et 4 Go de mémoire alloués. Je l'exécute en regardant jconsole, mais la mémoire semble être sévère à mesure que le nombre de fichiers augmente, il semble donc y avoir place à l'amélioration.

Je travaille actuellement sur la mise en cache des résultats et l'écriture d'histogrammes et de fonctionnalités dans un fichier et de les quitter en mémoire, mais cela ne fonctionne pas.

Je veux l'améliorer.

La fin.

référence

Recommended Posts

Détecter des vidéos similaires dans Java et OpenCV rev.2
Détecter des vidéos similaires dans Java et OpenCV rev.3
Détecter des vidéos similaires dans Java et OpenCV rev.1
Utiliser OpenCV avec Java
Exemple d'encodage et de décodage en Java
Classe StringBuffer et StringBuilder en Java
Comprendre equals et hashCode en Java
Java + OpenCV 3.X avec IntelliJ IDEA
Bonjour tout le monde en Java et Gradle
Différence entre final et immuable en Java
J'ai fait l'étalonnage de la caméra OpenCV en Java
Différence entre les listes d'arry et les listes liées en Java
Programmer les en-têtes et pieds de page PDF en Java
Apprenez les modèles Flyweight et ConcurrentHashMap en Java
La direction de Java dans "C ++ Design and Evolution"
De Java à C et de C à Java dans Android Studio
Lire et écrire des fichiers gzip en Java
Différence entre int et Integer en Java
Discrimination d'énum dans Java 7 et supérieur
Concernant les modificateurs transitoires et la sérialisation en Java
Utilisez OpenCV_Contrib (ArUco) avec Java! (Partie 1-Construire) (OpenCV-3.4.4)
Traitement parallèle et parallèle dans divers langages (édition Java)
Différence entre next () et nextLine () dans Java Scanner
Différences dans l'écriture des classes Java, C # et Javascript
Capture et sauvegarde de l'installation de sélénium en Java
Ajouter, lire et supprimer des commentaires Excel à l'aide de Java
Vérifier le comportement statique et public dans les méthodes Java
[Java] Comprenez en 10 minutes! Tableau associatif et HashMap
Distinguer les nombres positifs et négatifs en Java
Java ajoute et supprime les filigranes dans les documents Word
Représente le «jour suivant» et le «jour précédent» en Java / Android
Questions sur la gestion des exceptions Java throw et try-catch
Télécharger et télécharger des notes en java sur S3
Crypter / décrypter avec AES256 en PHP et Java
Générer OffsetDateTime à partir de Clock et LocalDateTime en Java
Partition en Java
Changements dans Java 11
Janken à Java
Java et JavaScript
XXE et Java
Taux circonférentiel à Java
FizzBuzz en Java
[Android / Java] Transition d'écran et traitement de retour par fragments
Convertir JSON et YAML en Java (en utilisant Jackson et SnakeYAML)
Essayé l'API Toot et Streaming de Mastodon en Java
Écrivez ABNF en Java et transmettez l'adresse e-mail
Organiser les builds dans des combinaisons C ++ / Java et Win / Linux
Vectoriser et imager les données d'images numériques manuscrites MNIST avec Java
Ecrire une classe en Kotlin et l'appeler en Java
[Java] Différence entre statique final et final dans les variables membres
Classes et instances Java comprises dans la figure
Jonction Java et division des cellules de tableau dans un document Word
Ceci et cela pour éditer ini en Java. : inieditor-java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Soustraire les constantes Enum des chaînes et des valeurs en Java
Utilisation correcte de la classe abstraite et de l'interface en Java