Определить последовательные видеоклипы - PullRequest
0 голосов
/ 17 июля 2011

Я длинный видеопоток, но, к сожалению, он имеет форму 1000 15-секундных клипов со случайным названием.Я хотел бы восстановить исходное видео, основываясь на некоторой степени «сходства» двух таких клипов 15-х годов, что отвечает на вопрос «активность в клипе 2 кажется расширением клипа 1».Между клипами есть небольшие промежутки - несколько сотен миллисекунд или около того каждый.Я также могу вручную исправить результаты, если они достаточно хороши, поэтому результаты не должны быть идеальными.

1 Ответ

0 голосов
/ 24 июля 2011

Очень упрощенным подходом может быть:

(a) Создание автоматизированного процесса для извлечения первого и последнего кадра каждого видеоклипа в известном формате изображения (например, JPG)и назовите их в соответствии с именами видеоклипов, например, если у вас есть видеоклипы:

clipA.avi, clipB.avi, clipC.avi

, вы можете создать следующие frame-images:

clipA_first.jpg, clipA_last.jpg, clipB_first.jpg, clipB_last.jpg, clipC_first.jpg, clipC_last.jpg

(b) Алгоритм сортировки:

1. Create a 'Clips' list of Clip-Records containing each:

(a) clip-name (string)
(b) prev-clip-name (string)
(c) prev-clip-diff (float)
(d) next-clip-name (string)
(e) next-clip-diff (float)

2. Apply the following processing:

for Each ClipX having ClipX.next-clip-name == "" do:
{
    ClipX.next-clip-diff = <a big enough number>;
    for Each ClipY having ClipY.prev-clip-name == "" do:
    {
       float ImageDif =  ImageDif(ClipX.last-frame.jpg, ClipY.first_frame.jpg);
       if (ImageDif < ClipX.next-clip-diff)
       {
           ClipX.next-clip-name = ClipY.clip-name;
           ClipX.next-clip-diff = ImageDif;
       }
    }
    Clips[ClipX.next-clip-name].prev-clip-name = ClipX.clip-name;
    Clips[ClipX.next-clip-name].prev-clip-diff = ClipX.next-clip-diff;
}

3. Scan the Clips list to find the record(s) with no <prev-clip-name> or 
   (if all records have a <prev-clip-name> find the record with the max <prev-clip-dif>.
   This is a good candidate(s) to be the first clip in sequence.

4. Begin from the clip(s) found in step (3) and rename the clip-files by adding 
   a 5 digits number (00001, 00002, etc) at the beginning of its filename and going 
   from aClip to aClip.next-clip-name and removing the clip from the list.

5. Repeat steps 3,4 until there are no clips in the list.

6. Voila! You have your sorted clips list in the form of sorted video filenames! 
   ...or you may end up with more than one sorted lists (if you have enough 
   'time-gap' between your video clips).

Очень упрощенно ... но я думаю, что это может быть эффективным ...

PS1: Относительно функции ImageDif (): Вы можете создать новый DifImage , что представляет собой разницу изображений ClipX.last-frame.jpg, ClipY.first_frame.jpg, а затем суммирует все пиксели DifImage в одну плавающую точку ImageDif значение.Вы также можете оптимизировать процесс для отмены разницы (или суммирования), если ваша сумма больше некоторого предела: вас действительно интересуют небольшие различия.Значение ImageDif , которое больше (экспериментального) предела, означает, что 2 изображения отличаются настолько сильно, что 2 клипа не могут располагаться один за другим.

PS2: Порядок алгоритма сортировкисложности должны быть примерно O (n * log (n)), поэтому для 1000 видеоклипов будет выполнено около 3000 сравнений изображений (или чуть больше, если вы оптимизируете алгоритм и разрешаете ему не находить соответствия для некоторых клипов)

...