Opened 12 days ago

Last modified 12 days ago

#6816 new enhancement

Combine "vidstabdetect" or "vidstabtransform" with scene detection

Reported by: JouMxyzptlk Owned by:
Priority: wish Component: undetermined
Version: unspecified Keywords: libvidstab
Cc: Blocked By:
Blocking: Reproduced by developer: no
Analyzed by developer: no

Description

Currently "vidstabdetect" does not detect a scene change.
The result is a very well visible jump at every scene change since it detects it as "extreme camera movement".

It is quite easy to detect in the .trf file due to their nonsense values:

Frame 66 (List 91 [(LM 0 0 833 213 112 0.717225 0.478954) <cut>
Frame 67 (List 47 [(LM -118 -138 1081 376 112 0.840303 21.377870) <cut>
Frame 68 (List 106 [(LM 0 4 957 213 112 0.846433 1.043925)

Frame 670 (List 97 [(LM 0 0 709 213 112 0.749554 1.124203) <cut>
Frame 671 (List 46 [(LM 86 16 833 213 112 0.646211 11.540179) <cut>
Frame 672 (List 105 [(LM 0 1 833 213 112 0.646211 0.761001) <cut>

Replacing them in this example with:
Frame 67 (List 0 [])
and
Frame 671 (List 0 [])
improves it a lot.

"killing" a few frames before and after improves it further.

Could this be automated either in "detect" to discard those nonsense values beyond "LM +-30" (as option), or in "vidstabtransform" the same way? During detection would be better IMHO.

playing around with the .trf also exploited a bug:

Deleting the offending line instead of replacing them with the dummy entry causes ffmpeg version 3.4 (Windows x64) to crash with:

[vid.stab - serialization @ 000000a4d63fdcb8] VID.STAB file: index of frames is not continuous 324 -< 330VID.STAB file: index of frames is not continuous 668 -< 674VID.STAB file: index of frames is not continuous 756 -< 762Assertion failed!

Program: c:\prog\ffmpeg\bin\ffmpeg.exe
File: /Users/kyle/software/vidstab/src/vidstab-20170830-afc8ea9/src/vsvector.c, Line 76

Expression: V

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

I'll try to implement a workaround now, automatically scan the .trf file for those bad lines and replace them.

Change History (2)

comment:1 Changed 12 days ago by cehoyos

  • Keywords libvidstab added; deshake vidstabdetect scene change removed
  • Priority changed from normal to wish

comment:2 Changed 12 days ago by JouMxyzptlk

The script workaround for now:

Replaces one "out of whack" line, matching any three digit LM block value is a quite cheap approach, but it works:

sed -re "s/(Frame [0-9]+ ).*LM\ [0-9][0-9][0-9].*/\1\(List 0 \[\]\)/g" transform1.trf > transform2.trf

Replaces three lines, the one before and the one after:

sed -re "1N;$!N;s/(Frame [0-9]+ )(.*)(Frame [0-9]+ ).*LM\ [0-9][0-9][0-9].*(Frame [0-9]+ )(.*)/\1(List 0 \[\]\)\n\3\(List 0 \[\]\)\n\4\(List 0 \[\]\)/;P;D" transform1.trf > transform2.trf

Different approach for three lines:

sed -re ":a; $q; N; s/(Frame [0-9]+ )(.*)(Frame [0-9]+ ).*LM\ [0-9][0-9][0-9].*(Frame [0-9]+ )(.*)/\1(List 0 \[\]\)\n\3\(List 0 \[\]\)\n\4\(List 0 \[\]\)/; 3,${P;D}; ba" transform1.trf > transform2.trf

Latter version allows going insane to replace 5 lines, two before and two after...

sed -re ":a; $q; N; s/(Frame [0-9]+ ).*(Frame [0-9]+ ).*(Frame [0-9]+ ).*LM\ [0-9][0-9][0-9].*(Frame [0-9]+ ).*(Frame [0-9]+ ).*/\1(List 0 \[\]\)\n\2\(List 0 \[\]\)\n\3\(List 0 \[\]\)\n\4\(List 0 \[\]\)\n\5\(List 0 \[\]\)/; 5,${P;D}; ba" transform1.trf > transform2.trf

It's been quite a while since I played with sed so deeply...

Last edited 12 days ago by JouMxyzptlk (previous) (diff)
Note: See TracTickets for help on using tickets.