python-opencv消除视频中的黑色闪屏

python-opencv消除视频中的黑色闪频


# -*- coding =utf-8 -*-
# @Time :2022/4/17 21:05
# @Author :clerk
# @File :消除视频黑屏.py
# @Software :PyCharm
import uuid
from ffmpy import FFmpeg
from moviepy.editor import *
import cv2


# 提取音频
def get_audio(input_path: str, audio_out_path: str):
    audio = AudioFileClip(input_path)
    audio.write_audiofile(audio_out_path)


# 消除黑屏
def getout_blck(input_path: str, movie_out_path: str):
    capture = cv2.VideoCapture(input_path)
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    fps = capture.get(cv2.CAP_PROP_FPS)  # 获取原视频fps值
    width = int(capture.get(cv2.CAP_PROP_FRAME_WIDTH))  # 获取原视频的高度和宽度
    height = int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT))
    writer = cv2.VideoWriter(movie_out_path, fourcc, fps, (width, height), True)
    i = 0
    if capture.isOpened():  # 检测摄像头是否打开
        while True:
            i += 1
            ret, img_src = capture.read()
            if not ret:
                break
            # 查看黑图(利用从cv2.cvtColor转为灰度图,得到暗值判断是否为黑图)
            gray_img = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY)  # 获取灰度图矩阵的行数和列数
            r, c = gray_img.shape[:2]
            piexs_sum = r * c  # 整个弧度图的像素个数为r*c
            # 获取偏暗的像素(表示0~19的灰度值为暗) 此处阈值可以修改
            dark_points = (gray_img < 20)
            target_array = gray_img[dark_points]
            dark_sum = target_array.size
            # 判断灰度值为暗的百分比
            dark_prop = dark_sum / piexs_sum
            if i == 1:
                writer.write(img_src)
            elif dark_prop >= 0.85:
                writer.write(img_out)
                continue  # 若为黑图则替换为上一帧图片
            else:
                writer.write(img_src)
            img_out = img_src
    else:
        print('视频打开失败')
    print("消除完成")
    writer.release()


# 音频和视频结合
def audio_add_movie(movie_out_path: str, audio_out_path: str, dir_path: str):
    _ext_video = os.path.basename(movie_out_path).strip().split('.')[-1]
    _ext_audio = os.path.basename(audio_out_path).strip().split('.')[-1]
    if _ext_audio not in ['mp3', 'wav']:
        raise Exception('audio format not support')
    _codec = 'copy'
    if _ext_audio == 'wav':
        _codec = 'aac'
    result = os.path.join(dir_path, '{}.{}'.format(uuid.uuid4(), _ext_video))
    ff = FFmpeg(executable="D:/测试/EVCapture/ffmpeg.exe",
                inputs={movie_out_path: None, audio_out_path: None},
                outputs={
                    result: '-map 0:v -map 1:a -c:v copy -c:a {} -shortest'.format(_codec)})  # executable中为ffmpeg.exe路径
    ff.run()


def main():
    input_path = "C:/测试/test.mp4"  # 原视频路径
    audio_out_path = "C:/测试/test.mp3"  # 音频路径
    movie_out_path = "C:/测试/clean.mp4"  # 消除黑屏视频后路径
    dir_path = "C:/测试/"  # 保存路径
    get_audio(input_path, audio_out_path)
    getout_blck(input_path, movie_out_path)
    audio_add_movie(movie_out_path, audio_out_path, dir_path)


if __name__ == "__main__":
    main()
    print("完成")

其中 若是原视频文件后缀为avi,fourcc=cv2.VideoWriter_fourcc(*‘XVID’)

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,可以使用OpenCV库来处理图像和视频。要消除阴影,可以使用以下步骤: 1. 加载图像:使用OpenCV的`cv2.imread()`函数加载要处理的图像。 2. 转换为灰度图像:使用`cv2.cvtColor()`函数将彩色图像转换为灰度图像。这是因为在灰度图像上更容易进行阴影消除操作。 3. 阴影消除:有多种方法可以消除阴影,以下是其一种常用的方法: - 计算图像的直方图:使用`cv2.calcHist()`函数计算灰度图像的直方图。 - 找到直方图的峰值:通过查找直方图的峰值,可以确定阴影的像素值范围。 - 应用阈值:使用`cv2.threshold()`函数将图像分割为两个部分,一个是阴影部分,另一个是非阴影部分。 - 进行亮度调整:对于阴影部分,可以通过增加其亮度来消除阴影效果。可以使用`cv2.add()`函数将一个常数值添加到阴影部分的像素上。 4. 显示结果:使用`cv2.imshow()`函数显示处理后的图像。 下面是一个示例代码,演示了如何使用PythonOpenCV消除图像的阴影: ```python import cv2 # 加载图像 image = cv2.imread('image.jpg') # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 计算直方图 hist = cv2.calcHist([gray], [0], None, [256], [0, 256]) # 找到直方图的峰值 peaks = cv2.findPeaks(hist) # 应用阈值 _, threshold = cv2.threshold(gray, peaks[0], 255, cv2.THRESH_BINARY_INV) # 进行亮度调整 adjusted = cv2.add(image, 50) # 显示结果 cv2.imshow('Original Image', image) cv2.imshow('Thresholded Image', threshold) cv2.imshow('Adjusted Image', adjusted) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值