Erkennen Sie ähnliche Videos in Java und OpenCV Version 3

Wir arbeiten noch daran.

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

Erkennen ähnlicher Videos in Java und OpenCV Rev. 2 - Qiita

Ergebnis-Cache

Durch Speichern des Ergebnisses für die Datei, die einmal verarbeitet wurde, wird die Bildverarbeitung nicht zum zweiten Mal von OpenCV ausgeführt.

Speichern Sie Mat

Die Matte des Bildes sollte durch Imwrite als Bild gespeichert werden, aber das Berechnungsergebnis des Histogramms usw. konnte nicht durch Imwrite gespeichert und durch Imread gelesen werden.

Es gibt eine generische Möglichkeit, Mat in einer Datei in C ++ zu speichern, aber es scheint, dass Sie es selbst erstellen müssen, da in Java nichts eingeschlossen ist.

Da Mat Matrix ist, dh Matrixdaten, können sie vertikal, horizontal und als Datenarray ausgedrückt werden. Im Fall von Mat verfügt es zusätzlich über einen Typcode, der den Datentyp darstellt.

Zu diesem Zweck ist die Datenmenge nicht so groß, daher werde ich sie als JSON-Daten speichern. Ich habe die Gson-Bibliothek von Google verwendet, um mit Json umzugehen.

Dies ist der Speicherteil.

	/**
	 *Speichern Sie Mat in Datei
	 * @param filename
	 * @param mat
	 * @throws IOException
	 */
	public static void storeMat(String filename, Mat mat) throws IOException {
		String jsondata = matToJson(mat);
		PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(new File(filename))));
		writer.write(jsondata);
		writer.close();
	}

	/**
	 *Konvertieren Sie Mat in das Json-Format
	 * @param mat
	 * @return
	 */
	public static String matToJson(Mat mat) {
		JsonObject obj = new JsonObject();

		if (mat.isContinuous()) {
			int cols = mat.cols();
			int rows = mat.rows();
			int elemSize = (int) mat.elemSize();
			int type = mat.type();
			String typeStr = CvType.typeToString(type);
			int dataSize = cols * rows * elemSize;
			if (rows == 0) {
				dataSize = cols * elemSize;
			}

			String dataString = "";
			if (typeStr.contains("32F")) {
				float[] data = new float[dataSize];
				String[] strData = new String[dataSize];
				mat.get(0, 0, data);
				for (int i = 0; i < data.length; i++) {
					strData[i] = String.valueOf(data[i]);
				}
				dataString = String.join(",", strData);
			} else if (typeStr.contains("8U")) {
				byte[] data = new byte[dataSize];
				String[] strData = new String[dataSize];
				mat.get(0, 0, data);
				for (int i = 0; i < data.length; i++) {
					strData[i] = String.valueOf(data[i]);
				}
				dataString = String.join(",", strData);
			}

			obj.addProperty("rows", mat.rows());
			obj.addProperty("cols", mat.cols());
			obj.addProperty("type", mat.type());
			obj.addProperty("data", dataString);

			Gson gson = new Gson();
			String json = gson.toJson(obj);

			return json;
		} else {
			System.err.println("");
		}
		return "{}";
	}

Dies ist der Leseteil.

	/**
	 *Lesen Sie Mat aus der Datei
	 * @param filename
	 * @return
	 * @throws IOException
	 */
	public static Mat loadMat(String filename) throws IOException {
		InputStream input = new FileInputStream(filename);
		int size = input.available();
		byte[] buffer = new byte[size];
		input.read(buffer);
		input.close();
		return matFromJson(new String(buffer));
	}

	/**
	 *Erstellen Sie Mat aus Json
	 * @param json
	 * @return
	 */
	public static Mat matFromJson(String json) {
		JsonParser parser = new JsonParser();
		JsonObject JsonObject = parser.parse(json).getAsJsonObject();

		int rows = JsonObject.get("rows").getAsInt();
		int cols = JsonObject.get("cols").getAsInt();
		int type = JsonObject.get("type").getAsInt();
		String typeStr = CvType.typeToString(type);

		String dataString = JsonObject.get("data").getAsString();
		Mat mat = new Mat(rows, cols, type);
		String[] splitedStr = dataString.split(",");
		if (typeStr.contains("32F")) {
			float[] data = new float[splitedStr.length];
			for (int i = 0; i < data.length; i++) {
				data[i] = Float.parseFloat(splitedStr[i]);
			}
			mat.put(0, 0, data);
		} else if (typeStr.contains("8U")) {
			byte[] data = new byte[splitedStr.length];
			for (int i = 0; i < data.length; i++) {
				data[i] = Byte.parseByte(splitedStr[i]);
			}
			mat.put(0, 0, data);
		} else {
			System.err.println("");
		}

		return mat;
	}

Der Mat-Typ ist nur für 8U und 32F geeignet und für allgemeine Zwecke ein wenig übertrieben. Bei Bedarf, z. B. 64F → double, muss für jeden Typ etwas hinzugefügt werden.

Python (Pandas) ist hervorragend in der einfachen Handhabung der Matrix und des JSON hier.

Speichern Sie andere Videoinformationen

Ich habe java.util.Properties verwendet und es als Eigenschaftendatei gespeichert.

Properties videoProperty = new Properties();
videoProperty.setProperty("playtime", String.valueOf(time));
videoProperty.setProperty("width", String.valueOf(width));
videoProperty.setProperty("height", String.valueOf(height));
videoProperty.setProperty("fps", String.valueOf(fps));
videoProperty.setProperty("size", String.valueOf(fileSize));
videoProperty.store(new FileOutputStream(metadata.getMetaFilename()), "");

Speichern Sie das Vergleichsergebnis

Zuerst habe ich versucht, es in CSV zu speichern, aber schließlich habe ich beschlossen, es in SQLite zu speichern. Ich habe CSV aufgegeben, weil es verschiedene Bibliotheken gibt und ich die von mir ausgewählte nicht bekommen konnte.

Die erstellte Tabelle.

CREATE TABLE IF NOT EXISTS compare_video ( 
	key text PRIMARY KEY, 
	file1 text, 
	file2 text, 
	timediff integer, 
	hist real, 
	feature real, 
	skip integer 
)

Ich habe hier ein Feld namens "Überspringen" vorbereitet. Dies ist ein Flag, das angibt, dass dieses Vergleichsergebnis vom Ergebnis ausgeschlossen ist. Es wird gesetzt, wenn festgestellt wird, dass es sich bei einer Sichtprüfung unterscheidet oder wenn sich die Wiedergabezeit um 10% oder mehr unterscheidet.

Verbesserungen der Benutzeroberfläche

Das Folgende wurde zur Vereinfachung der Verwendung hinzugefügt.

Für die Wiedergabe möchte ich es mit der zugehörigen Anwendung starten, aber es funktioniert nicht ... Vorerst versuche ich es mit einer festen Anwendung zu starten.

Der Bildschirm nach der Änderung.

image

Der Sinn für Design ist empfindlich. ..

Andere

Fleißige Freigabe

Vergessen Sie nicht, Mat # release häufig aufzurufen, wenn Sie mit einer großen Anzahl von Bildern arbeiten. Insbesondere im Fall von Java sind die Ressourcen des Mat-Objekts, die von JNI zugewiesen zu werden scheinen, nicht sichtbar. Seien Sie daher besonders vorsichtig.

Gleiches gilt für Video Capture.

Einstellungen für Antivirensoftware

Als ich eine große Anzahl von Dateien erstellte, war die CPU-Auslastung hoch, aber die Ursache war Antivirensoftware. Es scheint besser, dies so einzustellen, dass die Echtzeitsuche des Zielordners deaktiviert wird.

Referenz

OpenCV Mat object serialization in java - Stack Overflow

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