国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于python實現(xiàn)去除視頻的水印

這篇具有很好參考價值的文章主要介紹了基于python實現(xiàn)去除視頻的水印。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我們再搬運視頻的時候常常會遇到視頻有水印的問題 如下 下面就通過python來實現(xiàn)對視頻水印的去除

在pycharm新建一個項目,創(chuàng)建image,video目錄其他不用 必要條件

在終端下載相關依賴包

python去除視頻水印,python,音視頻,numpy

pip install moviepy==1.0.3
pip installnumpy==1.21.5
pip install opencv_python==4.5.5.62

將要去除水印的視頻放在video目錄下,運行一下????????

python去除視頻水印,python,音視頻,numpy

python去除視頻水印,python,音視頻,numpy

用鼠標操作去除的部分,回車即可

去除了水印的視頻輸出到了output文件夾下

python去除視頻水印,python,音視頻,numpy

查看效果,還不錯?

?python去除視頻水印,python,音視頻,numpy文章來源地址http://www.zghlxwxcb.cn/news/detail-595240.html

代碼實現(xiàn)

import os
import sys

import cv2
import numpy
from moviepy import editor

VIDEO_PATH = 'video'
OUTPUT_PATH = 'output'
TEMP_VIDEO = 'temp.mp4'

class WatermarkRemover():
  
  def __init__(self, threshold: int, kernel_size: int):
    self.threshold = threshold #閾值分割所用閾值
    self.kernel_size = kernel_size #膨脹運算核尺寸
  
  def select_roi(self, img: numpy.ndarray, hint: str) -> list:
    '''
    框選水印或字幕位置,SPACE或ENTER鍵退出
    :param img: 顯示圖片
    :return: 框選區(qū)域坐標
    '''
    COFF = 0.7
    w, h = int(COFF * img.shape[1]), int(COFF * img.shape[0])
    resize_img = cv2.resize(img, (w, h))
    roi = cv2.selectROI(hint, resize_img, False, False)
    cv2.destroyAllWindows()
    watermark_roi = [int(roi[0] / COFF), int(roi[1] / COFF), int(roi[2] / COFF), int(roi[3] / COFF)]
    return watermark_roi

  def dilate_mask(self, mask: numpy.ndarray) -> numpy.ndarray:
    
    '''
    對蒙版進行膨脹運算
    :param mask: 蒙版圖片
    :return: 膨脹處理后蒙版
    '''
    kernel = numpy.ones((self.kernel_size, self.kernel_size), numpy.uint8)
    mask = cv2.dilate(mask, kernel)
    return mask

  def generate_single_mask(self, img: numpy.ndarray, roi: list, threshold: int) -> numpy.ndarray:
    '''
    通過手動選擇的ROI區(qū)域生成單幀圖像的水印蒙版
    :param img: 單幀圖像
    :param roi: 手動選擇區(qū)域坐標
    :param threshold: 二值化閾值
    :return: 水印蒙版
    '''
    #區(qū)域無效,程序退出
    if len(roi) != 4:
      print('NULL ROI!')
      sys.exit()
    
    #復制單幀灰度圖像ROI內(nèi)像素點
    roi_img = numpy.zeros((img.shape[0], img.shape[1]), numpy.uint8)
    start_x, end_x = int(roi[1]), int(roi[1] + roi[3])
    start_y, end_y = int(roi[0]), int(roi[0] + roi[2])
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    roi_img[start_x:end_x, start_y:end_y] = gray[start_x:end_x, start_y:end_y]

    #閾值分割
    _, mask = cv2.threshold(roi_img, threshold, 255, cv2.THRESH_BINARY)
    return mask

  def generate_watermark_mask(self, video_path: str) -> numpy.ndarray:
    '''
    截取視頻中多幀圖像生成多張水印蒙版,通過邏輯與計算生成最終水印蒙版
    :param video_path: 視頻文件路徑
    :return: 水印蒙版
    '''
    video = cv2.VideoCapture(video_path)
    success, frame = video.read()
    roi = self.select_roi(frame, 'select watermark ROI')
    mask = numpy.ones((frame.shape[0], frame.shape[1]), numpy.uint8)
    mask.fill(255)

    step = video.get(cv2.CAP_PROP_FRAME_COUNT) // 5
    index = 0
    while success:
      if index % step == 0:
        mask = cv2.bitwise_and(mask, self.generate_single_mask(frame, roi, self.threshold))
      success, frame = video.read()
      index += 1
    video.release()

    return self.dilate_mask(mask)

  def generate_subtitle_mask(self, frame: numpy.ndarray, roi: list) -> numpy.ndarray:
    '''
    通過手動選擇ROI區(qū)域生成單幀圖像字幕蒙版
    :param frame: 單幀圖像
    :param roi: 手動選擇區(qū)域坐標
    :return: 字幕蒙版
    '''
    mask = self.generate_single_mask(frame, [0, roi[1], frame.shape[1], roi[3]], self.threshold) #僅使用ROI橫坐標區(qū)域
    return self.dilate_mask(mask)

  def inpaint_image(self, img: numpy.ndarray, mask: numpy.ndarray) -> numpy.ndarray:
    '''
    修復圖像
    :param img: 單幀圖像
    :parma mask: 蒙版
    :return: 修復后圖像
    '''
    telea = cv2.inpaint(img, mask, 1, cv2.INPAINT_TELEA)
    return telea
  
  def merge_audio(self, input_path: str, output_path: str, temp_path: str):
    '''
    合并音頻與處理后視頻
    :param input_path: 原視頻文件路徑
    :param output_path: 封裝音視頻后文件路徑
    :param temp_path: 無聲視頻文件路徑 
    '''
    with editor.VideoFileClip(input_path) as video:
      audio = video.audio
      with editor.VideoFileClip(temp_path) as opencv_video:
        clip = opencv_video.set_audio(audio)
        clip.to_videofile(output_path)

  def remove_video_watermark(self):
    '''
    去除視頻水印
    '''
    if not os.path.exists(OUTPUT_PATH):
      os.makedirs(OUTPUT_PATH)

    filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]
    mask = None

    for i, name in enumerate(filenames):
      if i == 0:
        #生成水印蒙版
        mask = self.generate_watermark_mask(name)

      #創(chuàng)建待寫入文件對象
      video = cv2.VideoCapture(name)
      fps = video.get(cv2.CAP_PROP_FPS)
      size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
      video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)
    
      #逐幀處理圖像
      success, frame = video.read()

      while success:
        frame = self.inpaint_image(frame, mask)
        video_writer.write(frame)
        success, frame = video.read()

      video.release()
      video_writer.release()

      #封裝視頻
      (_, filename) = os.path.split(name)
      output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_watermark.mp4')#輸出文件路徑
      self.merge_audio(name, output_path, TEMP_VIDEO)
  
  if os.path.exists(TEMP_VIDEO):
    os.remove(TEMP_VIDEO)

  def remove_video_subtitle(self):
    '''
    去除視頻字幕
    '''
    if not os.path.exists(OUTPUT_PATH):
      os.makedirs(OUTPUT_PATH)

    filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]
    roi = []

    for i, name in enumerate(filenames):
      #創(chuàng)建待寫入文件對象
      video = cv2.VideoCapture(name)
      fps = video.get(cv2.CAP_PROP_FPS)
      size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
      video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)
    
      #逐幀處理圖像
      success, frame = video.read()
      if i == 0:
        roi = self.select_roi(frame, 'select subtitle ROI')

      while success:
        mask = self.generate_subtitle_mask(frame, roi)
        frame = self.inpaint_image(frame, mask)
        video_writer.write(frame)
        success, frame = video.read()

      video.release()
      video_writer.release()

      #封裝視頻
      (_, filename) = os.path.split(name)
      output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_sub.mp4')#輸出文件路徑
      self.merge_audio(name, output_path, TEMP_VIDEO)

    if os.path.exists(TEMP_VIDEO):
      os.remove(TEMP_VIDEO)

if __name__ == '__main__':
  #去除視頻水印
  remover = WatermarkRemover(threshold=80, kernel_size=5)
  remover.remove_video_watermark()

  #去除視頻字幕
  remover = WatermarkRemover(threshold=80, kernel_size=10)
  remover.remove_video_subtitle()

到了這里,關于基于python實現(xiàn)去除視頻的水印的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 抖音視頻無水印采集拓客軟件|視頻批量下載提取工具

    抖音視頻無水印采集拓客軟件|視頻批量下載提取工具

    抖音視頻無水印批量采集拓客軟件助力高效營銷! ? ? ? ? 隨著抖音平臺的崛起,視頻已成為各行各業(yè)進行營銷的重要工具。但是,傳統(tǒng)的視頻下載方式往往效率低下,無法滿足快速獲取大量視頻的需求。針對這一問題,我們開發(fā)了一款視頻無水印批量采集拓客軟件。 工具

    2024年04月14日
    瀏覽(24)
  • Qt音視頻開發(fā)47-文字和圖片水?。纱鎯Φ組P4中)

    近期花了兩周時間閉門啃硬骨頭,主要就解決三個問題(音視頻同步存儲和推流、圖片水印并將水印信息存儲到文件或者推流、rtsp推流),這三個問題困擾了很多年,以至于找遍了網(wǎng)絡和翻遍ffplay代碼以及ffmpeg示例的代碼,通過不下于上百次方案的調(diào)整和測試,幾乎每次都是

    2024年02月16日
    瀏覽(43)
  • FFMpeg-3、基于QT實現(xiàn)音視頻播放顯示

    FFMpeg-3、基于QT實現(xiàn)音視頻播放顯示

    1、音視頻播放的基礎知識 內(nèi)容來自雷神博客 1、在Windows平臺下的視頻播放技術主要有以下三種:GDI,Direct3D和OpenGL;音頻播放技術主要是DirectSound。 SDL本身并不具有播放顯示的功能,它只是封裝了底層播放顯示的代碼 記錄三種視頻顯示技術:GDI,Direct3D,OpenGL。其中Direct3D包

    2024年02月03日
    瀏覽(36)
  • 使用Python采集某網(wǎng)站視頻,實現(xiàn)音視頻自動合成!

    使用Python采集某網(wǎng)站視頻,實現(xiàn)音視頻自動合成!

    ? 開發(fā)環(huán)境 模塊的使用 采集下破站視頻數(shù)據(jù) 通過開發(fā)者工具進行抓包分析,分析破站視頻數(shù)據(jù)的來源。 開發(fā)者工具的使用 打開方式: 鼠標右鍵點擊檢查選擇Network F12 ctrl + shift + i 想要開發(fā)者工具中有數(shù)據(jù)加載, 需要 刷新網(wǎng)頁。 通過元素(Element)面板,我們能查看到想抓取

    2024年02月06日
    瀏覽(16)
  • 【復】基于 WebRTC 的音視頻在線監(jiān)考模塊的設計與實現(xiàn)(下)

    【復】基于 WebRTC 的音視頻在線監(jiān)考模塊的設計與實現(xiàn)(下)

    在上一篇博文 【復】基于 WebRTC 的音視頻在線監(jiān)考模塊的設計與實現(xiàn)(上) 中,主要介紹了關于 WebRTC 的基本理論,那么這篇文章我們將進入實戰(zhàn)階段,通過 WebRTC 框架,去實現(xiàn) P2P 通話,以及延伸到一對多的音視頻通話,從而實現(xiàn)在線監(jiān)考功能; ? 在開發(fā) Web 時,WebRTC 標準

    2024年02月01日
    瀏覽(29)
  • 《保姆級教程》基于Agora SDK實現(xiàn)音視頻通話及屏幕共享

    《保姆級教程》基于Agora SDK實現(xiàn)音視頻通話及屏幕共享

    ??作者簡介: 小曾同學.com,一個致力于測試開發(fā)的博主??,主要職責:測試開發(fā)、CI/CD 如果文章知識點有錯誤的地方,還請大家指正,讓我們一起學習,一起進步。?? 座右銘:不想當開發(fā)的測試,不是一個好測試??。 如果感覺博主的文章還不錯的話,還請點贊、收藏哦

    2024年02月12日
    瀏覽(21)
  • 保姆級教程!基于聲網(wǎng) Web SDK實現(xiàn)音視頻通話及屏幕共享

    保姆級教程!基于聲網(wǎng) Web SDK實現(xiàn)音視頻通話及屏幕共享

    本篇文章主要給小伙伴們分享如何使用聲網(wǎng) SDK 實現(xiàn) Web 端音視頻通話及屏幕共享功能,其中也會涵蓋在實踐過程中遇到的一些問題,以此記錄防止小伙伴們踩坑,同時也希望通過從 0 到 1 實戰(zhàn)的分享,能夠幫助更多的小伙伴。

    2024年02月16日
    瀏覽(27)
  • 基于webrtc的音視頻通話,實現(xiàn)相機流識別人臉的功能

    這幾天研究了一下webRTC的基礎能力,在此基礎之上能實現(xiàn)的視頻通話,互動等更多實用功能。項目中使用的是阿里的rtc,我研究的是聲網(wǎng)的是否符合功能,后續(xù)會總結和記錄一下應用到的幾個功能實現(xiàn)方法。 今天要記錄的功能是項目流識別人臉的功能,其實類似功能很常見了

    2024年04月28日
    瀏覽(27)
  • 【python】fastapi response返回文本、音視頻多媒體資源實現(xiàn)

    HTMLResponse 是FastAPI中自帶的一個響應類,用于返回HTML格式的響應。使用方法如下: 在上面的例子中,我們在裝飾器中指定了 response_class=HTMLResponse ,表示我們需要返回一個HTML響應。然后在函數(shù)中,我們返回了一個HTML格式的字符串。FastAPI會自動將這個字符串封裝成一個 HTMLR

    2023年04月27日
    瀏覽(27)
  • Unity Metaverse(八)、RTC Engine 基于Agora聲網(wǎng)SDK實現(xiàn)音視頻通話

    Unity Metaverse(八)、RTC Engine 基于Agora聲網(wǎng)SDK實現(xiàn)音視頻通話

    本文介紹如何在Unity中接入聲網(wǎng)SDK,它可以應用的場景有許多,例如直播、電商、游戲、社交等,音視頻通話是其實時互動的基礎能力。 如下圖所示,可以在官網(wǎng)中選擇Unity SDK進行下載,也可以到 Unity Asset Store 資源商店中搜索 Agora SDK 進行下載導入。 在官網(wǎng)中前往 Console 控制

    2024年02月09日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包