用opencv和moviepy实现视频边缘检测

用opencv实现视频音频提取和画面灰度

成果展示
python边缘检测视频

1.提取视频

1.1首先从网上下载一个视频

贝贝,然后输入你要解析的b站视频BV号,下载mp4格式

2.2 下载依赖
pip3 insntall moviepy==1.0.0#1.0.0的能用write_videofile()
pip3 install PyAudio
pip3 install winsound
pip3 install opencv-python
pip3 install librosa
2.3 提取视频代码
import cv2  as cv#导入opencv
import numpy as np
import librosa.display
import matplotlib.pyplot as plt
# 单张测试
#img=cv.imread("d:\\cry\\Videos\\Captures\\710027277-1-208.mp4")  #读取图片
#ca=cv.Canny(img,100,100)  #边缘检测
#ga=cv.GaussianBlur(img, (5, 5), 0) #高斯模糊
#cv.namedWindow('canny',0)
#cv.resizeWindow('canny', 700, 500)
#cv.imshow("canny",ca)
#cv.waitKey(0)
#cv.namedWindow('Blurred Image',0)
#cv.resizeWindow('Blurred Image', 700, 500)
#cv.imshow("Blurred Image",ga)
#cv.waitKey(0)

# 1.源视频处理
capture = cv.VideoCapture("d:\\cry\\Videos\\Captures\\710027277-1-208.mp4")  # 首先获取并打开源视频,这个自己弄好路径就好,不要有中文
# 获取开始帧和介绍帧,start和end 是我们想要从整个视频中想要截取的一小段视频的开始和结束
start = 0 
# 2.创建一个写入视频对象
# 下面三个cap.get我加了int()强制类型转换,因为返回的是float类型,在创建写入视频对象时不允许,也有可能有的opencv版本不需要,大家可以自行尝试判断,加一个不碍事
weight=int(capture.get(cv.CAP_PROP_FRAME_WIDTH)) #获取视频的长宽和fps
height=int(capture.get(cv.CAP_PROP_FRAME_HEIGHT))
fps=int(capture.get(cv.CAP_PROP_FPS))
# fourcc = cv.VideoWriter_fourcc('M', 'J', 'P', 'G') #用于avi格式的生成的参数
# fourcc = cv.VideoWriter_fourcc(*'mp4v')  # 用于mp4格式的生成的参数
# fourcc = cv.VideoWriter_fourcc('P', 'I', 'M', 'I')  # 用于avi格式的生成的参数
# videowriter = cv.VideoWriter(output, fourcc, fps, (weight, height),isColor=False)  # 创建一个写入视频对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #avi,就这个好使
 
videowriter = cv.VideoWriter('testwrite.avi',fourcc, fps, (width, htight),False) #False表示不要颜色

# 3.开始保存目标视频
capture.set(cv.CAP_PROP_POS_FRAMES, start)  # 设置开始帧
#pos = capture.get(cv.CAP_PROP_POS_FRAMES)  # 获取当前帧数
# while capture.get(cv.CAP_PROP_POS_FRAMES)!=None:  # 读取全部帧数
while capture.isOpened():  # 读取全部帧数
# while pos
    ret, frame = capture.read()  # 从开始帧开始读取,之后会从开始帧依次往后读取,直到退出循环
    if ret==True:
        ca=cv.Canny(frame,100,100)  #值越大结果边缘越明显
        # cv.imshow('frame',ca) #展示
        videowriter.write(ca)
        if cv.waitKey(10) & 0xFF == ord('q'):
            break
    else:
        break
    #pos = capture.get(cv.CAP_PROP_POS_FRAMES)  # 获取当前帧数pos
videowriter.release()  # 关闭写入视频对象
capture.release()  # 关闭读取视频对象
cv.destroyAllWindows()

2.提取音频代码

import moviepy.editor as mpy
audio_background = mpy.AudioFileClip(r'10027277-1-208.mp4')
audio_background.write_audiofile(r'testwrite.wav') #保存
PlaySound('testwrite.wav',flags=1) #播放音频
  • 展示声音图
audio, freq = librosa.load('testwrite.wav')
time = np.arange(0, len(audio)) / freq
print(len(audio), type(audio), freq, sep="\t")
audio, _ = librosa.effects.trim(audio)
librosa.display.waveshow(audio, sr=freq)
plt.show()
  • 测试声音
import time
PlaySound("testwrite.wav",flags=1)
time.sleep(5)
PlaySound(None,flags=1)

3.播放声音和视频代码

name='testwrite.avi' 
# name='./target.mp4' 
def main():
    # 1.初始化读取视频对象
    cap = cv.VideoCapture(name)
    #声音
    PlaySound(None,flags=1)  #None表示关闭,先关闭所有的然后再开
    PlaySound('testwrite.wav', flags=1)  #flag=1表示异步 2表示同步播放声音
    # 2.循环读取图片
    while cap.isOpened():
        ret, frame = cap.read()
        if ret:
            #展示cv库视频
            cv2.imshow("frame", frame)
        else:
            print("视频播放完成!")
            break
        # 退出播放
        key = cv.waitKey(25)
        if key == 27:  # 按键esc
            PlaySound(None,flags=1) 
            break
    # 3.释放资源
    cap.release()
    cv.destroyAllWindows()
if __name__ == '__main__':
    print("begin")
    main()

4.合成wav和avi为mp4

audioclip = mpy.AudioFileClip("testwrite.wav")
audioclip =mpy.AudioFileClip(r'10027277-1-208.mp4').subclip(1,60)
videoclip = mpy.VideoFileClip("testwrite.avi").subclip(1,60)
videoclip2 = videoclip.set_audio(audioclip)
video = mpy.CompositeVideoClip([videoclip2])
""" *** bitrate 设置比特率,比特率越高, 合并的视频越清晰,视频文件也越大,合并的速度会很慢"""
# video.write_videofile("testwrite.mp4", codec='mpeg4',fps,(width,height))  
# video.write_videofile("testwrite.mp4", codec='mpeg4')
# video.write_videofile("testwriteLibmp3lame.mp4",audio_codec="libmp3lame")  
# video.write_videofile("testwriteWav32.mp4",audio_codec="pcm_s32le")  
video.write_videofile("testwriteWav16.mp4",audio_codec="pcm_s16le")  
# video.to_videofile("testwrite.mp4")  

audioclip.close()
videoclip.close()
video.close()
类型 参数
map3 libmp3lame(默认)
ogg libvorbis(ogv或webm时的默认)
m4a libfdk_acc
16-bit wav pcm_s16le
32-bit wav pcm_s32le

哪个都试了一遍但是没声音呀,还是用PlaySound吧。

求助:

moviepy合成声音和视频后没有声音。

你可能感兴趣的:(opencv,python,imagepy,opencv,计算机视觉,python)