Не могу собрать видео по кадрам, чтобы оно совпадало с оригинальным
У меня задача, сделать проект по стеганографии в контейнере видео (нужно спрятать текст в видео). Я выбрал такой способ - разбиваем видео на кадры, изменяем случайный кадр (номер кадры сообщаем) , собираем новое видео. При извлечении информации я разбиваю новое видео на кадры, беру нужный кадр и извлекаю из него информацию. Но у меня проблема с извлечением информации. Я проверил, моя программа верно прячет информацию и если взять этот кадр то информацию можно прочесть. Но если собрать видео, а потом его разобрать, то информацию не получается считать
Я разделил программу на несколько файлов, пока используется 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 562 это номер кадра, в котором информация (нужно для функции extraction)
Результат после использования функции extraction
Можете сказать в чем проблема или какой инструмент использовать, буду благодарен