实现对图片或者视频增长隐蔽水印和提取水印

打印 上一主题 下一主题

主题 819|帖子 819|积分 2457

好久好久没有写博客了,最近看见一个很故意思的文章:鉴戒你的电脑被窃听,就是说在一些公司,截图都会存在水印,方便溯源,然后出于技术的好奇,我在github上搜了一下,还真有相干的github项目:对图片举行水印增长和提取,下面是地址:blind_watermark
1.实现对图片的水印提取
pip install blind-watermark
# 嵌入水印: blind_watermark --embed --pwd 1234 examples/pic/ori_img.jpeg "watermark text" examples/output/embedded.png
# 提取水印: blind_watermark --extract --pwd 1234 --wm_shape 111 examples/output/embedded.png 
很简单,就是按着命令后走就行,但是问题是:公司的图片里面隐蔽的水印的加密方式,我们也不知道啊,我提取了一下我的截图,出现的就是乱码
2.实现对视频的水印添加和提取
这个没什么,就是在上面的基础上,对视频举行分帧,然后对每帧举行水印的添加,然后再加添加了水印的图片合成video,另有对每帧举行水印的提取。
  1. import os
  2. from blind_watermark import WaterMark
  3. import cv2
  4. def frames_to_video(frame_folder, output_video_path, frame_rate):
  5.     frame_paths = sorted([os.path.join(frame_folder, f) for f in os.listdir(frame_folder)])
  6.     first_frame = cv2.imread(frame_paths[0])
  7.     height, width, _ = first_frame.shape
  8.     fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  9.     video = cv2.VideoWriter(output_video_path, fourcc, frame_rate, (width, height))
  10.     for frame_path in frame_paths:
  11.         frame = cv2.imread(frame_path)
  12.         video.write(frame)
  13.     video.release()
  14. def embed_watermark_on_frames(input_folder, output_folder, password_img, password_wm, watermark):
  15.     bwm = WaterMark(password_img=password_img, password_wm=password_wm)
  16.     bwm.read_wm(watermark, mode='str')
  17.     for frame_path in os.listdir(input_folder):
  18.         frame_full_path = os.path.join(input_folder, frame_path)
  19.         bwm.read_img(frame_full_path)
  20.         output_frame_path = os.path.join(output_folder, frame_path)
  21.         bwm.embed(output_frame_path)
  22. def video_to_frames(video_path, output_folder):
  23.     cap = cv2.VideoCapture(video_path)
  24.     frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
  25.     frame_rate = int(cap.get(cv2.CAP_PROP_FPS))
  26.     frame_idx = 0
  27.     while cap.isOpened():
  28.         ret, frame = cap.read()
  29.         if not ret:
  30.             break
  31.         frame_path = f"{output_folder}/frame_{frame_idx:04d}.png"
  32.         cv2.imwrite(frame_path, frame)
  33.         frame_idx += 1
  34.     cap.release()
  35.     return frame_count, frame_rate
  36. def extract_watermark_from_frames(frame_folder, password_img, password_wm, wm_shape):
  37.     bwm = WaterMark(password_img=password_img, password_wm=password_wm)
  38.     for frame_path in os.listdir(frame_folder):
  39.         frame_full_path = os.path.join(frame_folder, frame_path)
  40.         watermark = bwm.extract(frame_full_path, wm_shape=wm_shape, mode='str')
  41.         print(f"Watermark from {frame_path}: {watermark}")
  42. # 分解视频
  43. video_path = "test.mp4"
  44. output_frames_folder = "frames"
  45. os.makedirs(output_frames_folder, exist_ok=True)
  46. frame_count, frame_rate = video_to_frames(video_path, output_frames_folder)
  47. # 嵌入水印
  48. watermark = "secret"
  49. password_img = 1
  50. password_wm = 1
  51. output_watermarked_frames = "watermarked_frames"
  52. os.makedirs(output_watermarked_frames, exist_ok=True)
  53. embed_watermark_on_frames(output_frames_folder, output_watermarked_frames, password_img, password_wm, watermark)
  54. # 合成为视频
  55. output_video_path = "watermarked_video.mp4"
  56. frames_to_video(output_watermarked_frames, output_video_path, frame_rate)
  57. # 提取水印
  58. extract_watermark_from_frames(output_watermarked_frames, password_img, password_wm, wm_shape=len(watermark))
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

风雨同行

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表