Wir arbeiten noch daran.
Erkennen ähnlicher Videos in Java und OpenCV Version 1 - Qiita
Erkennen ähnlicher Videos in Java und OpenCV Rev. 2 - Qiita
Durch Speichern des Ergebnisses für die Datei, die einmal verarbeitet wurde, wird die Bildverarbeitung nicht zum zweiten Mal von OpenCV ausgeführt.
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.
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()), "");
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.
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.
Der Sinn für Design ist empfindlich. ..
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.
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.
OpenCV Mat object serialization in java - Stack Overflow
Recommended Posts