yurikhan: (Default)

Съездили в Красноярск на фестиваль интеллектуальных игр «Енисейская знать». 8 (из 38 команд) место в ЧГК, чуть-чуть не прошли в плейофф Брейн-ринга.

Вот чего я не понимаю: почему для обсчёта результатов ЧГК пишут специальную программу на Delphi, где достаточно было бы spreadsheet’а типа Excel’я или OpenLibreOffice Calc.

Как организовать таблицу )
yurikhan: (Default)

Дано: видеофайл с вшитыми субтитрами.

Требуется: определить точки, где происходит смена субтитров.

Инструменты:

  • AviSynth 2.5
  • VirtualDubMod, любой версии
  • Текстовый редактор
  • Microsoft Excel
  • Инструмент для подсматривания цвета пиксела в шестнадцатеричном виде

Ход работы

  1. Для начала нам нужно загрузить файл. Если субтитры не по всей длине, то оставим ту часть, где они есть и нам нужны. Удалим звук — это ускорит обработку.
    DirectShowSource("Revolutionary Girl Utena - 05.avi", fps=23.976)
    s = Trim(21578, 28310).KillAudio()
  2. Выделим те области, которые близки к цвету букв субтитров.
    bin = s.ConvertToRGB32() \
           .ColorKeyMask($288028, 30) \
           .ShowAlpha()

    (цвет и tolerance подбираются опытным путём).

  3. Теперь у нас есть клип, в котором белый цвет соответствует фону, чёрный — буквам. Когда субтитры сменяются, будет большая разница между соседними кадрами. Выведем в файл среднюю разность яркости.
    comma = ","
    WriteFile(bin.ConvertToYV12(), "05.log", \
              "current_frame", "comma", \
              "YDifferenceToNext()")
  4. Теперь берём лог в Excel и начинаем анализировать. Эксперимент показывает, что на всех реальных точках смены титров значение больше 0.64. Но этого условия недостаточно — существуют точки, где разность больше 0.64, но смены титров нет. Смотрим на разницу кадров, видим, что много одиночных меняющихся пикселов на краях букв, и чем больше букв, тем больше и общая разность.
  5. Тут у нас есть выбор. Мы можем пустить какой-нибудь шумодавящий фильтр. Или мы можем сказать, что, когда смены титра нет, значение разности в соседних кадрах примерно такое же, а когда есть, то на одном кадре наблюдается ярко выраженный максимум.
    ABCD
    10.641.1
    2FrameDiffYDiffY'Flag
    300.000003
    410.000003=2*B4-B3-B5=IF(AND($B4>=$B$1,$C4>=$C$1),1,0)
    26230.000003-1.4500160
    27241.4500192.6476721
    28250.252363-1.0807420
    629462910.7164550.6972070
    629562920.7207320.0142570
    629662930.7107520.0434870
  6. Перевод номеров кадров в часы:минуты:секунды.сотые доли тривиален и оставляется читателю в качестве упражнения.

Profile

yurikhan: (Default)
Yuri Khan

August 2018

S M T W T F S
   1234
567891011
12131415161718
19202122232425
26 2728293031 

Links

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated 2019-04-21 07:19
Powered by Dreamwidth Studios