Как прочитать конкретный видеокадр по его индексу кадров в Matlab? - PullRequest
4 голосов
/ 10 апреля 2019

Я работаю над алгоритмом, который берет один видеокадр по его индексу, обрабатывает его и получает следующий видеокадр нового индекса.

Я читаю видеофайл, используя функцию Matlab VideoReader.Чтобы прочитать следующий кадр, он предоставляет функцию readFrame.

Функция readFrame может занимать время кадра и считывать этот конкретный кадр в это время.Как мне использовать его для чтения определенного фрейма с заданным индексом?

Я использую Matlab 2016b в Linux.У меня есть функция mmread, которая берет имя файла видео и индекс кадра, чтобы прочитать кадр.Но этот файл зависит от 64-битного скомпилированного файла функций Matlab для Windows, поэтому я не могу его использовать.

Вот как я его использую:

for i = startIdx:endIdx
    frame = mmread(filename, i);
    ...
    processing the frame
    ...
end

Это ссылка к функции mmread, которую я получил для Windows.

Ответы [ 2 ]

1 голос
/ 11 апреля 2019

Дополнение к ответу @ ga97dil.Как он сказал, и Matlab предлагает не использовать функцию read , вместо этого предлагает использовать функцию VideoReader.readFrame для чтения кадра.

Поскольку эта функция нене принимает индекс кадра в качестве аргумента, но определенное время для чтения кадра, я подумал, что если я смогу преобразовать конкретный индекс кадра в его время в видео.Немного погуглив, я нашел эту нить в качестве решения.

Вот как я определил мою новую функцию mmread.m

function [ frame ] = mmread_1(filename, frameIdx)
    v = VideoReader(filename);  % read the video file
    v.CurrentTime = (frameIdx - 1) / v.FrameRate;  % calculate the time for the given frame index
    frame = readFrame(v);  % read the frame
end

Поскольку Matlab предлагает не использоватьфункция чтения (может быть, она будет удалена в будущих версиях), я предпочитаю не использовать ее из-за переносимости.

1 голос
/ 10 апреля 2019

Вы можете использовать функцию read .Однако документация предполагает, что это не рекомендуется (я не знаю почему).

v = VideoReader(filename);

for i = startIdx:endIdx
    frame = read(v,i);
    ...
    processing the frame
    ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...