Данные кадра изменяются при сохранении с помощью OpenCv (cv2)

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

Даже если я не применяю стеганографию, а просто извлекаю и сохраняю кадр как новое видео, кадры становятся совершенно другими, когда я извлекаю их снова.

Вот мой код, который я использую для извлечения и сохранения кадров с помощью OpenCv2.

import cv2

def get_frame_count(cap):        
     frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
     return frame_count

def get_fps_rate(cap):
     fps = cap.get(cv2.CAP_PROP_FPS)
     return fps

video_input_path = "./sample4.mp4"
cap = cv2.VideoCapture(video_input_path)
width = (int)(cap.get(cv2.CAP_PROP_FRAME_WIDTH ))   
height = (int)(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_count = get_frame_count(cap)
fps = get_fps_rate(cap)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter('newVideo.mp4', fourcc, fps, (width, height))

count = 0
while cap.isOpened():
    ret, frame = cap.read()
    video.write(frame)
    count = count + 1

    if (count >= (frame_count)):
        cap.release()
        break
video.release
cv2.destroyAllWindows()

Чтобы проверить равенство первого кадра в обоих видео (sample4.mp4 и newVideo.mp4), я использую этот код:

import cv2

def get_frame_count(cap):

        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) - 1
        return frame_count

video_input_path = "./sample4.mp4"
cap = cv2.VideoCapture(video_input_path)
frame_count = get_frame_count(cap)
width = (int)(cap.get(cv2.CAP_PROP_FRAME_WIDTH ))   
height = (int)(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
ret, frame = cap.read()
print frame
cap.release()

video_input_path = "./newVideo.mp4"
cap = cv2.VideoCapture(video_input_path)
frame_count = get_frame_count(cap)
width = (int)(cap.get(cv2.CAP_PROP_FRAME_WIDTH ))   
height = (int)(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
ret, frame = cap.read()
print frame
cap.release()

и данные кадра обоих кадров совершенно разные. Как это возможно?


person Vineet Yadav    schedule 09.05.2018    source источник
comment
mp4 использует сжатие с потерями, которое немного изменяет пиксели вашего кадра. Возможно, по-прежнему можно использовать mp4, но вам придется скрыть время во время кодирования видео в mp4 после шага с потерями.   -  person Reti43    schedule 09.05.2018
comment
Вот аналогия с использованием jpeg для стеганографии изображений   -  person Reti43    schedule 09.05.2018