Не могу собрать видео по кадрам, чтобы оно совпадало с оригинальным

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

Я разделил программу на несколько файлов, пока используется 2, hiding.py - для сокрытия информации и extraction.py - для чтения информации

Для разбивания видео использовал библиотеку OpenCV \n

hiding.py:

from random import randint
from stegano import exifHeader
import cv2
import os
import glob
import shutil

def getRandFrame(dir, range): #Выбирает случайный кадр
    numFrame = randint(0, int(range))
    randFrame = dir + "frame" + str(numFrame) + ".jpg"
    return (randFrame, numFrame)

def stega_encrypt(Text, img): #Прячет текст в кадр
    secret = exifHeader.hide(img, img.replace(".jpg", "CHANGE.jpg"), Text)
    os.remove(img)
    os.rename(img.replace(".jpg", "CHANGE.jpg"), img)

def getFrames(totalway, name, way): #Разбивает видео на кадры
    video = cv2.VideoCapture(totalway)
    ok, frame = video.read()
    if not os.path.exists(way + "Frames-{}/".format(name.replace(".mp4", ""))):
        os.mkdir(way + "Frames-{}/".format(name.replace(".mp4", "")))
    count = 0
    while ok:
        cv2.imwrite(way + "Frames-{}/".format(name.replace(".mp4", "")) + "frame{}.jpg".format(count), frame)
        #print('WRITTEN FRAME:',count)
        count+=1
        ok, frame = video.read()
    video.release()
    return (way + "Frames-{}/".format(name.replace(".mp4", "")), count)#Полный путь до папки с кадрами и кол-во кадров

def getVideo(totalway, dirFrames): # Собирает новое видео с использованием нового кадра
    cap = cv2.VideoCapture(totalway)
    fps = float(cap.get(cv2.CAP_PROP_FPS)) #fps старого видео
    #print(fps)


    img_array = []
    for filename in glob.glob(dirFrames + '*.jpg'):
        img = cv2.imread(filename)
        height, width, layers = img.shape
        size = (width,height)
        img_array.append(img)
    
    
    out = cv2.VideoWriter(totalway.replace(".mp4", "CHANGE.mp4"),cv2.VideoWriter_fourcc(*'mp4v'), fps, size)
    
    for i in range(len(img_array)):
        out.write(img_array[i])
    out.release()    

def hiding(totalway, Text="Привет мир!"): # "Основая" функция
    name = os.path.basename(totalway) # Берем название видео
    #print(name)
    way = totalway.replace(name, "") # Берем путь до видео
    #print(way)
    tmp = getFrames(totalway, name, way) # Разбиваем видео на кадры
    dirFrames = tmp[0] # Папка с кадрами
    countFrame = tmp[1] # количество кадров
    #print(dirFrames, countFrame)
    tmp1 = getRandFrame(dirFrames, countFrame) #Выбираем случайное значение
    frame = tmp1[0] # Полный путь до кадра
    numframe = tmp1[1] # Номер кадра (нужен для извлечение информации из нового видео)
    stega_encrypt(Text, frame) # Прячем тест
    print(frame)
    print(numframe)
    getVideo(totalway, dirFrames) # Создаем новое видео

    shutil.rmtree(dirFrames) # Удаляем папку с кадрами 

#hiding("C:/Users/urich/Videos/Desktop/Desktop123123.mp4", "Привет мир!!!")


extraction.py:

import hiding
import os
from stegano import exifHeader


def getInfo(dir, numframe):
    wayFrame = dir + "frame{}.jpg".format(numframe) # Путь до кадра с информацией
    print(wayFrame)
    secret = exifHeader.reveal(wayFrame).decode() # Извлекаем информацию
    return secret


def extraction(totalway, numframe):
    name = os.path.basename(totalway)
    #print(name)
    way = totalway.replace(name, "")
    #print(way)
    tmp = hiding.getFrames(totalway, name, way) # Разбиваем видео на кадры 
    dirFrames = tmp[0]
    countFrame = tmp[1]
    info = getInfo(dirFrames, numframe) # Извлекаем информацию
    print(info)
    print(dirFrames)

extraction("C:/Users/urich/Videos/Desktop/Desktop123123CHANGE.mp4", 562) # Desktop123123CHANGE.mp4 - Уже измененное видео 562 - это номер кадра в котором информация

Результат после использования функции hiding Результат после использования функции hiding 562 это номер кадра, в котором информация (нужно для функции extraction)

Результат после использования функции extraction Результат после использования функции extraction

Можете сказать в чем проблема или какой инструмент использовать, буду благодарен


Ответы (0 шт):