Du bist nicht angemeldet.

1

Dienstag, 29. Mai 2012, 03:43

bestimmte frames aus einem avi entfernen

Hallo zusammen!

Ich habe vor Kurzem ein Desktopaufnahme gemacht. Leider war wohl etwas an den Aufnahmeeinstellungen verkehrt und nun habe ich Frames im Video, die mich stören. Diese haben alle einen grauen Block gemeinsam. Gibt es eine Möglichkeit diese Frames automatisch zu finden und aus dem Video zu entfernen? Qualitätsverluste spielen dabei keine Rolle...

Vielen Dank

  • »schleiereule« ist männlich

Beiträge: 345

Dabei seit: 2. August 2010

Wohnort: Herne

Hilfreich-Bewertungen: 37

  • Private Nachricht senden

2

Dienstag, 29. Mai 2012, 13:48

Ein Tool oder Programm, welches die unerwünschten Frames automatisch findet gibt es glaub ich nicht. Aber mit bspw. Magix VDL kann man die Frames sehr gut heraus schneiden.

joey23

Co-Administrator

Beiträge: 5 147

Dabei seit: 12. September 2009

Hilfreich-Bewertungen: 1173

  • Private Nachricht senden

3

Dienstag, 29. Mai 2012, 14:05

Hatte neulich ein ähnliches Problem. Meine Lösung beruhte auf dem geringen Speicherverbrauch der grauen Flächen gegenüber dem normalen Inhalt:

- Film als Einzelbilder exportieren
- Dateien nach Dateigröße im Finder sortieren
- Dateien mit grauem Bereich fallen durch kleinere Dateigröße auf

So habe ich etwa 90% der Falschframes entfernen können.

Es haben bereits 1 registrierter Benutzer und 1 Gast diesen Beitrag als hilfreich eingestuft.

Benutzer, die diesen Beitrag hilfreich fanden:

the machine one

Dr_Allcome

Registrierter Benutzer

Beiträge: 239

Dabei seit: 12. April 2012

Hilfreich-Bewertungen: 66

  • Private Nachricht senden

4

Dienstag, 29. Mai 2012, 22:11

Mit nem Mac oder Linux geht das auch ohne viel manuelle Arbeit auf der Konsole, solange der graue Kasten immer an der gleichen Stelle ist:

- Film in Einzelbilder zerlegen
- Referenzbild mit grauen Kasten raussuchen.
- Position und Größe des grauen Kastens bestimmen (BREITExHÖHE+BREITEoffset+HÖHEoffset) - z.B. 150x150+800+600
- Kurz mal zwei Bilder mit nem grauen Kasten vergleichen:

Quellcode

1
compare -extract 150x150+800+600 -metric mae bild1.png referenz.png deleteme.png

- Das Ergebnis merken - z.B. 10
- Alle Bilder löschen lassen, die an der Stelle ebenfalls nen grauen Kasten haben:

Quellcode

1
for bild in *.jpg ; do value=$(compare -extract 150x150+800+600 -metric mae $bild reference.jpg deleteme.png 2>&1 | sed 's/[\. ].*//g') ; [ $value -lt 10 ] && rm $bild ; done

- Wenn noch welche übrig bleiben einfach den Schwellwert ein wenig erhöhen.


Das sieht jetzt ein wenig wild aus, weil ich's als Einzeiler geschrieben habe, aber wenn man das mal sauber in ein Shellskript verpackt, dann wird es lesbar und man hat ein Programm welches man immer wieder aufrufen kann. Anstatt die Bilder zu löschen kannst du sie natürlich auch irgendwohin verschieben lassen um sie danach prüfen zu können oder automatisch aus dem Video rausschneiden zu lassen.

Es hat bereits 1 Gast diesen Beitrag als hilfreich eingestuft.

5

Dienstag, 29. Mai 2012, 22:18

Danke für die schnellen und guten Tipps! Ich werde erstmal den Trick mit der Dateigröße testen ansonsten ist die Shellskript Variante natürlich sehr elegant!

6

Donnerstag, 31. Mai 2012, 16:44

Über die Dateigröße zu filtern ist sehr umständlich und zeitintensiv... Besser gefällt mir die Lösung über den Vergleich der Bilder! Allerdings bekomme ich nun immer eine Fehlermeldung beim Skript Durchlauf... wenn ich compare ausführe bekomme ich zwei Rückgabewerte:

Quellcode

1
tga # compare -extract 1200x900+120+0 -metric mae vid00005.tga reference.bmp deleteme.png

Quellcode

1
391.195 (0.00596925)


Ist es richtig, dass dann zu viele Argumente an $value übergeben werden? Gibt es eine Möglichkeit nur die 391 in $value zu schreiben?

Vielen Dank!

Dr_Allcome

Registrierter Benutzer

Beiträge: 239

Dabei seit: 12. April 2012

Hilfreich-Bewertungen: 66

  • Private Nachricht senden

7

Donnerstag, 31. Mai 2012, 20:31

Allerdings bekomme ich nun immer eine Fehlermeldung beim Skript Durchlauf... wenn ich compare ausführe bekomme ich zwei Rückgabewerte:

Quellcode

1
tga # compare -extract 1200x900+120+0 -metric mae vid00005.tga reference.bmp deleteme.png

Quellcode

1
391.195 (0.00596925)



Du solltest in diesem Fall einfach 391 (oder einfach 400) als Threshold nehmen. In Shellskripten lässt sich nur umständlich mit Fliesskommaeinheiten rechnen.

Zitat


Ist es richtig, dass dann zu viele Argumente an $value übergeben werden? Gibt es eine Möglichkeit nur die 391 in $value zu schreiben?


"value" sollte eigentlich automatisch berechnet werden. Auch sieht es mir irgendwie so aus, als ob deine extract-geometry falsch ist. 1200x900+120+0 bedeutet, dass du einen grauen Bereich der Größe 1200x900 hast, der innerhalb des Bildes an der Position 120x0 beginnt. Ist das bei dir wirklich der Fall?

Ich habe das mal in ein Shellskript gepackt welches ein wenig robuster ist. Getestet habe ich es aber im Moment nur unter Linux, nicht aufm Mac:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#!/bin/sh

THIS_PATH="$(readlink -e "$0")"
THIS_NAME="$(basename "$THIS_PATH")"

if [ $# -lt 4 ] ; then
	echo
	echo "Usage: $THIS_NAME <image-directory> <reference-image> <extraxt-geometry> <threshold>"
	echo
	echo "Example: $THIS_NAME /path/to/directory /path/to/reference.png 50x50+800+600 50"
	echo
	exit 1
fi

COMP_DIR="$1"
COMP_REFERENCE="$(readlink -e "$2")"
COMP_GEOMETRY="$3"
COMP_THRESHOLD="$(echo "$4" | sed 's/[\. ].*//g')"

[ ! -f "$COMP_REFERENCE" ] && echo "Could not find reference image '$COMP_REFERENCE'!" && exit 1

cd "$COMP_DIR"
[ $? -ne 0 ] && echo "Could not change to directory '$COMP_DIR'!" && exit 1

TMP_IMG="$(mktemp).png"

for bild in * ; do
	[ ! -f "$bild" ] && continue

	echo -n "Comparing image '$bild'..."
	value="$(compare -extract "$COMP_GEOMETRY" -metric mae "$bild" "$COMP_REFERENCE" "$TMP_IMG" 2>&1)"
	[ $? -ne 0 ] && echo "[ERROR] $value" && continue
	[ "$(echo "$value" | wc -l )" -ne 1 ] && echo "[ERROR] $value" && continue

	value="$(echo "$value" | sed 's/[\. ].*//g')"
	echo -n "[$value]"

	if [ $value -lt $COMP_THRESHOLD ] ; then
		echo " => [DELETED]"
		mv "$bild" "$bild.DELETEME"
	else
		echo
	fi

done

rm "$TMP_IMG"


Das Skript einfach in eine Datei "compare-images.sh" kopieren, die Datei ausführbar machen und dann aufrufen:

chmod 755 compare-images.sh
./compare-images.sh

Parameter:
- "image-directory" sollte ein Verzeichnis sein, welches NUR die Bilder enthält.
- "reference-image" sollte das Referenzbild sein, welches den grauen Kasten enthält. Dieses sollte nicht im image-directory liegen, da es sonst gelöscht wird.
- "extract-geometry" ist der Bereich in dem der graue Kasten innerhalb des Bildes zu finden ist
- "threshold" ist der compare Schwellwert

Bilder die den grauen Kasten enthalten werden in <bildname>.DELETEME umbenannt.

Es haben bereits 1 registrierter Benutzer und 1 Gast diesen Beitrag als hilfreich eingestuft.

Benutzer, die diesen Beitrag hilfreich fanden:

joey23

8

Freitag, 1. Juni 2012, 12:37

Wahnsinn! Vielen Dank für das Skript - es erfüllt genau seinen Zweck :) In solchen Foren erkundigt man sich doch gerne!

9

Donnerstag, 15. Oktober 2015, 20:06

Hallo,

ich bin neu im Forum und habe diesen Beitrag durch Google gefunden. Meine Frage ist ähnlich wie diese hier im Beitrag.

Ich möchte aus einer Aufnahme, vom PC Desktop, Werte unter bestimmten Bedingungen extrahieren und zuordnen. Am besten automatisch.
Habe dazu erst an programmierbares Video OCR gedacht. Dabei bin ich auf OpenCV+Tesseract (OCR Plugin) gestoßen. Das ist aber zu kompliziert für mich.

Hier ist ein Beispielvideo. []http://www.youtube.com/watch?v=cGDFAM9rG6o[/]

Ich muss erfassen, in welchem Feld der Tabelle die gelbe Markierung ist. z.B. C3

Dann müsste dem C3 Feld der Wert aus dem Rundinstrument zugeordnet werden. Und das ganze für alle 144 Felder.

Am Ende müsste rauskommen, um damit einen Durchschnitt je Feld zu ermitteln:

A1: 0,99; 0,89; 0,97; 1,02.....

A2: 1,03; 1,05; 0,85

Jetzt bin ich auf die Idee gekommen, mir das Video langsam anzuschauen und per Hand die Werte abzuschreiben. Dabei wäre nützlich, jedes Frame welches dem vorigen gleicht, zu löschen. So könnte ich die Zahl der Bilder im Video drastisch reduzieren.

Geht so was?

Hat jemand vielleicht noch eine Idee wie ich die Werte doch automaisch aus dem Video bekommen?

Dr_Allcome

Registrierter Benutzer

Beiträge: 239

Dabei seit: 12. April 2012

Hilfreich-Bewertungen: 66

  • Private Nachricht senden

10

Donnerstag, 15. Oktober 2015, 21:07

Hat jemand vielleicht noch eine Idee wie ich die Werte doch automaisch aus dem Video bekommen?


Wie lang ist denn das komplette Video? Sind das nur die 30 Sekunden auf Youtube? Da lohnt sich der Aufwand nämlich nicht wirklich, die paar Frames hast du schneller vorgespult.

Wenn du öfters solche Messungen machst, dann würde ich eher versuchen die Daten direkt am PC abzugreifen anstatt ein Video zu drehen und dieses dann zu verarbeiten.

11

Donnerstag, 15. Oktober 2015, 22:14

das Video ist länger.
Das Rundinstrument zeigt die Werte einer Breitbandlambdasonde im Auspuff eines Autos an. Misst also die Abgase.
Das springende gelbe Feld in der Tabelle zeigt den aktuellen Betriebszustand des Motors an. Der Wert in der Tabelle gibt die Menge an Kraftstoff an, welche in diesem Betriebszustand eingespritzt werden soll.
Wenn der Wert in der Tabelle passt, zeigt das Rundinstrument ca. 1,0 an.

Um den optimalen Wert pro Zelle zu ermittelten, muss man das Rundinstrument länger beobachten, einen Mittelfeld pro Zelle ermitteln und dann den Zellenwert anpassen. 144 Zellen sind eine ganze Menge.

Nach anpassen des Zellenwertes wäre eine neue Probefahrt nötig.

Die Daten direkt (ohne Video) zu verknüpfen bekomme ich nicht hin. Sind aus zwei verschiedenen Programmen. Eigentlich wäre noch ein drittes Programm wichtig. Dieses zeigt an, ob der Motor im Leerlauf/Vollgas Zustand ist. Dieser Zustand darf nicht ausgewertet werden - das gelbe Feld bleibt in dem Fall dort stehen, wo es vorher war. Das Rundinstrument zeigt weiter an.

12

Mittwoch, 6. Januar 2016, 15:01

Ich habe aus meinem Video alle doppelten Frames entfernt. Dies ging mit Avisynth und VirtualDub. Jetzt sind aus 20.000 Bildern nur 6.000 geworden.
Ich habe mir Ubuntu installiert. Meine 6000 jpeg Bilder sind im Ordner /home/basti/Schreibtisch/jpeg/
In den Bildern wandert ständig ein gelbes Feld hin und her. Das gelbe Feld kann an 144 Positionen sein.
Ich möchte jetzt die die 6000 Bilder sortieren. Alle mit dem gelben Feld an der gleichen Position sollen zusammen.

Ich habe ein Bild mit dem gelben Feld an Position A3 (0000.jpg) mit einem anderen verglichen, in dem das Feld nicht gelb ist (0080.jpg).
compare -extract 1x1+100+100 -metric mae /home/basti/Schreibtisch/jpeg/0080.jpeg /home/basti/Schreibtisch/jpeg/0000.jpeg /home/basti/Schreibtisch/deleteme.jpeg
Rausgekommen ist 21845 als Wert.

Den zweiten Befehl habe ich auch ausgeführt.
for bild in /home/basti/Schreibtisch/jpeg/*.jpeg ; do value=$(compare -extract 1x1+100+100 -metric mae $bild /home/basti/Schreibtisch/0000.jpeg /home/basti/Schreibtisch/deleteme.jpeg 2>&1 | sed 's/[\. ].*//g') ; [ $value -lt 21845 ] && rm $bild ; done

Er hat alle Bilder gelöscht welchen den der Stelle wie 0000.jpg gelb waren. Sie sind aber komplett weg, kann sie also nicht aus dem Papierkorb holen um sie zu sortieren. Leider kenne ich mich mit Linux nicht so gut aus. Kannst du/ihr mir helfen den Befehl so zu ändern, dass die Bilder umbenannt oder in einen Ordern verschoben werden?

Social Bookmarks