Оценка/компенсация движения MPEG1

Я видел следующее объяснение для оценки/компенсации движения для MPEG 1, и мне просто интересно, правильно ли оно:

Почему бы нам просто не закодировать необработанную разницу между текущим блоком и эталонным блоком? Потому что числа для остатка обычно намного меньше. Например, скажем, объект ускоряется по изображению. Положение x в 11 кадрах было следующими числами. 12 16 20 25 31 38 48 59 72 84 96 Необработанные различия будут x 4 4 5 6 7 10 11 13 12 12 Таким образом, прогнозируемые значения будут x x 20 24 30 37 45 58 70 85 96 Таким образом, остатки равны x x 0 1 1 1 3 1 2 -1 0

Является прогнозом для кадра[i+1] = (кадр[i] - кадр[i-1]) + кадр[i], т. е. добавляет вектор движения двух предыдущих опорных кадров к самому последнему система отсчета? Затем мы кодируем остаток предсказания, который является фактически захваченным снимком кадра [i+1] - кадр предсказания [i+1], и отправляем его в декодер?


person user915071    schedule 21.01.2012    source источник
comment
Я бы посоветовал прочитать этот мой ответ, чтобы развеять большинство ваших сомнений: dsp.stackexchange.com/questions/986/ Прочитав это, вы сможете уточнить свои вопрос.   -  person Dipan Mehta    schedule 22.01.2012
comment
привет, дипан.. если честно, я видел такие ответы раньше.. мой вопрос более фундаментален.. все, что я хочу знать, это предсказание для кадра [i + 1], предсказанное, как я изложил в своем первом посте. Или кадр прогнозируется следующим образом: прогнозируемый кадр[i+1] = (кадр[i+1]-кадр[i]) + кадр[i], т.е. вектор движения для текущего кадра, вычисленный с использованием двух предыдущих опорных кадров . Или он вычисляется с использованием текущего кадра и предыдущего опорного кадра?? Спасибо   -  person user915071    schedule 22.01.2012
comment
frame[i+1] = (frame[i] - frame[i-1]) + frame[i] неправильно! Пожалуйста, прочитайте мой ответ, он ответит, верна ли ваша предпосылка actual captured shot of frame[i+1] - prediction frame[i+1].   -  person Dipan Mehta    schedule 23.01.2012


Ответы (1)


Декодирование MPEG1 (компенсация движения) работает следующим образом:

Прогнозы и векторы движения превращают опорный кадр в следующий (текущий) кадр. Вот как вы будете вычислять каждый пиксель нового кадра:

Для каждого макроблока у вас есть набор прогнозируемых значений (отличий от системы отсчета). Вектор движения является значением относительно опорного кадра.

// Each luma and chroma block are 8x8 pixels
    for(y=0; y<8; y++)
    {
       for (x=0; x<8; x++)
       {
          NewPixel(x,y) = Prediction(x,y) + RefPixel(x+motion_vector_x, y+motion_vector_y)
       }
    }

В MPEG1 у вас есть кадры I, P и B. I-кадры полностью кодируются внутри (например, аналогично JPEG) без ссылок на другие кадры. P-кадры кодируются предсказаниями из предыдущего кадра (либо I, либо P). B-кадры кодируются с предсказаниями в обоих направлениях (предыдущий и следующий кадр). Обработка B-кадров немного усложняет видеопроигрыватель, поскольку он может ссылаться на следующий кадр, поэтому каждый кадр имеет порядковый номер, а B-кадры делают последовательность нелинейной. Другими словами, ваш видеодекодер должен удерживать потенциально 3 кадра при декодировании потока (предыдущий, текущий и следующий).

person BitBank    schedule 17.02.2012