Кадры Matlab претерпевают изменение значения пикселя после реконструкции. как этого избежать?

Я хотел бы расширить свой проект по водяным знакам изображения на видео, используя метод прогнозирования и сортировки. Для этого, простыми словами, я хочу обработать каждый кадр, внести некоторые изменения в значения пикселей на стороне отправителя, реконструировать видео из измененного кадров и хотите отменить все эти изменения пикселей на стороне получателя. Моя проблема в том, что когда видео восстанавливается после редактирования кадров, значения пикселей снова меняются. я проверил его с кодом, приведенным ниже. (я не вносил никаких изменений в пиксели, просто читал из первого видео, записывал эти кадры в другое видео в том же формате и проверял значения пикселей первых кадров обоих видео)

readerobj = VideoReader('produce.mp4');
vidFrames = read(readerobj);
numFrames = get(readerobj, 'NumberOfFrames')

outputVideo = VideoWriter('produce_new','MPEG-4');
outputVideo.FrameRate = readerobj.FrameRate;
open(outputVideo);
q=1;
x=read(readerobj,q);
for q=1:numFrames
    frames=read(readerobj,q);
    frame_store=frames;
    writeVideo(outputVideo,frame_store); 
end

close(outputVideo);

readerobj = VideoReader('produce_new.mp4');
vidFrames = read(readerobj);
numFrames = get(readerobj, 'NumberOfFrames')
q=1;
y=read(readerobj,q);
count=0;

for i=1:size(x,1)
     for j=1:size(x,2)
          if x(i,j)~=y(i,j)
             count=count+1;
          end 
     end

конечный счет

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


person user3197936    schedule 04.03.2014    source источник


Ответы (1)


MPEG-4 не без потерь, по крайней мере, не так, как VideoWriter использует его здесь.

Попробуйте установить для аргумента profile значение 'Archival' при создании VideoWriter (т.е. writerObj = VideoWriter(filename,profile));

profile

Строка, заключенная в одинарные кавычки, описывающая тип создаваемого файла. Указание профиля устанавливает значения по умолчанию для свойств видео, таких как VideoCompressionMethod. Возможные значения:

'Archival' Файл Motion JPEG 2000 со сжатием без потерь

'Motion JPEG AVI' Сжатый файл AVI с использованием кодека Motion JPEG

'Motion JPEG 2000' Сжатый файл Motion JPEG 2000

'MPEG-4' Сжатый файл MPEG-4 с кодировкой H.264 (системы с Windows 7 или Mac OS X 10.7 и выше)

'Uncompressed AVI' Несжатый файл AVI с видео RGB24

Однако 'Archival' даст файл большого размера, а 'MPEG-4' даст наилучший компромисс качества сжатия, если ваша система поддерживает кодировку H.264. Для методов сжатия с потерями (например, 'MPEG-4' или 'Motion JPEG AVI') использование более высокого значения Quality улучшит качество, но значения пикселей будут различны, независимо от того, какое высокое качество установлено.

Обратите внимание, что при сжатии без потерь параметр Quality не используется.


ПРИМЕЧАНИЕ. Чтобы подсчитать количество разных пикселей без цикла:

count = sum(x(:)==y(:))
person chappjc    schedule 04.03.2014
comment
сэр, количество кадров в обоих видео одинаковое, значения пикселей точно такие же, так что это значит, когда вы говорите, что восстановленный файл, полученный с использованием «архивного» профиля, будет больше исходного? ... - person user3197936; 07.03.2014
comment
@user3197936 user3197936 Размер файла на диске будет больше, чем если бы вы использовали MPEG-4. - person chappjc; 07.03.2014