Под белым флагом пост, или Как я спас ваш видеокурс от появления на трекере

tnc2w_eanffeyudfj7cl9wzsil4.jpeg
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# Usage: python3 fckInfoprotectorV2.py

import os
from shutil import rmtree

import numpy as np
import cv2


class VideoSigner:

	def __init__(self, video, watermark):
		os.makedirs('original')
		os.makedirs('watermarked')

		self.vidin = cv2.VideoCapture(video)
		self.fps = self.vidin.get(cv2.CAP_PROP_FPS)
		self.frame_size = (
			int(self.vidin.get(cv2.CAP_PROP_FRAME_WIDTH)),
			int(self.vidin.get(cv2.CAP_PROP_FRAME_HEIGHT))
		)

		self.watermark = cv2.imread(watermark, cv2.IMREAD_UNCHANGED)
		self.wH, self.wW = self.watermark.shape[:2]

		B, G, R, A = cv2.split(self.watermark)
		B = cv2.bitwise_and(B, B, mask=A)
		G = cv2.bitwise_and(G, G, mask=A)
		R = cv2.bitwise_and(R, R, mask=A)
		self.watermark = cv2.merge([B, G, R, A])

	def __del__(self):
		rmtree('original')
		rmtree('watermarked')

	def _split(self):
		print('[*] Splitting video by frames... ', end='', flush=True)

		(success, image), count = self.vidin.read(), 0
		while success:
			path = os.path.join('original', f'{count}.jpg')
			cv2.imwrite(path, image)
			success, image = self.vidin.read()
			count += 1

		print('Done')

	def _watermark(self):
		print('[*] Signing each frame... ', end='', flush=True)

		for image_name in sorted(
			os.listdir('original'),
			key=lambda x: int(x.split('.')[0])
		):
			image_path = os.path.join('original', image_name)
			image = cv2.imread(image_path)
			h, w = image.shape[:2]

			image = np.dstack([
				image,
				np.ones((h, w), dtype='uint8') * 255
			])

			overlay = np.zeros((h, w, 4), dtype='uint8')
			half_h_diff = (h - self.wH) // 2
			half_w_diff = (w - self.wW) // 2
			overlay[half_h_diff:half_h_diff + self.wH, half_w_diff:half_w_diff + self.wW] = self.watermark

			output = image.copy()
			cv2.addWeighted(overlay, 0.25, output, 1.0, 0, output)

			path = os.path.join('watermarked', image_name)
			cv2.imwrite(path, output)

		print('Done')

	def _merge(self):
		print('[*] Merging signed frames... ', end='', flush=True)

		self.vidout = cv2.VideoWriter(
			'signed.avi',
			cv2.VideoWriter_fourcc(*'XVID'),
			fps=self.fps,
			frameSize=self.frame_size
		)

		for image_name in sorted(
			os.listdir('watermarked'),
			key=lambda x: int(x.split('.')[0])
		):
			image_path = os.path.join('watermarked', image_name)
			image = cv2.imread(image_path)
			self.vidout.write(image)

		print('Done')

	def sign(self):
		self._split()
		self._watermark()
		self._merge()


if __name__ == '__main__':
	signer = VideoSigner('SampleVideo_1280x720_1mb.mp4', 'watermark.png')
	signer.sign()


© Habrahabr.ru