• 入门opencv,欢笑快乐每一天


     🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝

    🥰 博客首页:knighthood2001

    😗 欢迎点赞👍评论🗨️

    ❤️ 热爱python,期待与大家一同进步成长!!❤️

    👀给大家推荐一款很火爆的刷题、面试求职网站👀

    跟我一起来刷题吧

    先上结果,已成习惯(以下只截取了一部分)

    本篇文章主要分成四个部分。即

            ①原始视频逐帧提取

            ②逐帧合成新视频

            ③原始视频音频提取

            ④音视频合成最终有声完整视频

    目录

    前期准备

    ①原始视频逐帧提取

    ②逐帧合成新视频

    ③原始视频音频提取

    ④音视频合成最终有声完整视频

    图片展示

    总结


    前期准备

            首先我们需要准备一个视频(最好是mp4格式的)

            文件目录如下(ikun文件夹可要可不要,因为待会会生成)

    ①原始视频逐帧提取

            首先,导入cv2 

    1. import cv2
    2. cap = cv2.VideoCapture('ikun.mp4')
    3. fps = cap.get(cv2.CAP_PROP_FPS)
    4. width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
    5. height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
    6. frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    7. print('fps:', fps)
    8. print('width:', width)
    9. print('height:', height)
    10. print('frames:', frames)
    cv2.VideoCapture(0)中参数0表示默认为笔记本内置第一个摄像头,若想要读取已有的视频,则改为视频所在地址。如上面的cv2.VideoCapture('ikun.mp4')

    接下来就是调用函数,查看视频的帧率、宽度、高度、以及视频中图片总数(一帧表示一张图片)

    结果如下:注意(以下返回的结果,其数据类型都是float类型,而不是int类型)

    1. fps: 25.01398992725238
    2. width: 854.0
    3. height: 480.0
    4. frames: 1490.0

    接下来我们创建一个用来存放提取出来的帧的文件夹,用os模块判断是否应该创建

    1. # 创建一个新的目录,用来存放修改后的每一帧
    2. path = 'ikun'
    3. if not os.path.exists(path):
    4. os.mkdir(path)

    接下来我们采用opencv非常常见的canny边缘检测

    1. i = 0
    2. while True:
    3. flag, frame = cap.read()
    4. # 转换成灰度
    5. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    6. # 图像处理(平滑)平均
    7. blur = cv2.blur(gray, (3, 3))
    8. # 应用对数变换
    9. img_log = (np.log(blur+1)/(np.log(1+np.max(blur))))*255
    10. # 指定数据类型
    11. img_log = np.array(img_log, dtype=np.uint8)
    12. # 图像平滑:双边滤波器
    13. bilateral = cv2.bilateralFilter(img_log, 5, 75, 75)
    14. # 边缘检测
    15. edges = cv2.Canny(bilateral, 100, 200)
    16. # 形态闭合算子
    17. kernel = np.ones((5, 5), np.uint8)
    18. closing = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel)
    19. # todo
    20. # 创建特征检测方法,nfeatures参数0默认为500
    21. orb = cv2.ORB_create(nfeatures=1500)
    22. # 制作特色图片
    23. keypoints, descriptors = orb.detectAndCompute(closing, None)
    24. featuredImg = cv2.drawKeypoints(closing, keypoints, None)
    25. filename = path + '/{}.jpg'.format(str(i))
    26. print(filename)
    27. # 保存图片
    28. cv2.imwrite(filename, featuredImg)
    29. i = i + 1
    30. # 如果i大于图片总数,则退出
    31. if i > int(frames):
    32. break

            首先,检测边缘不需要彩色信息,因此转为灰度图,此外,边缘检测的算法对噪声很敏感,所以采用滤波器来改善边缘检测器的性能。

            接着我们使用OpenCV的ORB角点检测,ORB算法是FAST算法和BRIEF算法的结合,ORB可以用来对图像中的关键点快速创建特征向量,并用这些特征向量来识别图像中的对象。当然你也可以采用其他方法。

    ①实例化ORB

        orb = cv2.ORB_create(nfeatures=1500)

    参数:

    • nfeatures:特征点的最大数量

    ②利用orb.detectAndCompute()检测关键点并计算

        keypoints, descriptors = orb.detectAndCompute(closing, None)
    

    ③将关键点检测结果绘制在图像上

    cv2.drawKeypoints(image, keypoints, outputimage, color, flags)

    参数:

    • image: 原始图像
    • keypoints:关键点信息,将其绘制在图像上
    • outputimage:输出图片,可以是原始图像
    • color:颜色设置,通过修改(b,g,r)的值,更改画笔的颜色,b=蓝色,g=绿色,r=红色。
    • flags:绘图功能的标识设置

    这里笔者搞得比较简单

        featuredImg = cv2.drawKeypoints(closing, keypoints, None)

    ④保存图片

    1. filename = path + '/{}.jpg'.format(str(i))
    2. # 保存图片
    3. cv2.imwrite(filename, featuredImg)

    最后使用i判断是否将每张图都进行更改并保存。


    ②逐帧合成新视频

    1. import cv2
    2. size = (854, 480)
    3. # todo
    4. videowrite = cv2.VideoWriter('output_ikun.mp4', -1, 25, size)
    5. # 'output_ikun.mp4'是视频保存的文件,25是帧数,size是图片尺寸
    6. n = 1490
    7. path = 'ikun'
    8. '''1'''
    9. # img_array = []
    10. # for filename in ['ikun1/{0}.jpg'.format(i) for i in range(n)]:
    11. # # print(filename)
    12. # img = cv2.imread(filename)
    13. # if img is None:
    14. # print(filename + " is error!")
    15. # continue
    16. # img_array.append(img)
    17. # for i in range(n):#把读取的图片文件写进去
    18. # videowrite.write(img_array[i])
    19. # videowrite.release()
    20. # print('end!')
    21. '''2'''
    22. # img_arr = []
    23. # for i in range(n):
    24. # img = cv2.imread(path + "/{}.jpg".format(i))
    25. # img_arr.append(img)
    26. # for i in range(n):
    27. # videowrite.write(img_arr[i])
    28. # videowrite.release()
    29. # print('end!')
    30. '''3'''
    31. for i in range(n):
    32. img = cv2.imread(path + "/{}.jpg".format(i))
    33. videowrite.write(img)
    34. videowrite.release()
    35. print('end!')

    代码如上

    其中size为①原始视频逐帧提取中获取到的宽和高(注意:这里的size笔者尝试了,应该要和获取到的宽和高一样,否则报错)

    n就是获取到的总图片数

    #注释掉的代码由于比较复杂,笔者将其简化在下面了。

    ③原始视频音频提取

    1. import moviepy.editor as mp
    2. def extract_audio(videos_file_path):
    3. # print(videos_file_path)
    4. # print(videos_file_path.split('.')[0])
    5. my_clip = mp.VideoFileClip(videos_file_path)
    6. my_clip.audio.write_audiofile(f'{videos_file_path.split(".")[0]}.mp3')
    7. extract_audio('ikun.mp4')

            视频提取音频,这里笔者采用的是moviepy模块,这里就不细细道来了,之后有机会可以好好和大家讲一讲该模块。 

            这里的videos_file_path是原始视频地址。

    ④音视频合成最终有声完整视频

    1. import moviepy.editor as mp
    2. video = mp.VideoFileClip('output_ikun.mp4')
    3. audio = mp.AudioFileClip('ikun.mp3')
    4. video_merge = video.set_audio(audio)
    5. video_merge.write_videofile('final_ikun.mp4')

    同上

    video是我们新制作的无声音的mp4;

    audio是我们从原视频分离出来的音频; 

    最终音视频合并在final_ikun.mp4中。


    图片展示

    呀,搞错了,这是下一期内容

    以下是最终目录


    总结

            学了以上内容,你会对opencv更加感兴趣,去尝试是否能调出更好的图片以及视频。

    最重要的一点:本文仅探讨技术,采用上述的例子,只是希望你能对opencv更加感兴趣!!

    下期预告:如上图的上图所示!

  • 相关阅读:
    (一)java基础篇---第一个程序
    1039 到底买不买
    C. Carrying Conundrum(思维 + 奇偶数位)
    灵感收集·创意写作软件评测:Flomo、Obsidian Memo、Napkin、FlowUs
    《Go Web 编程》之第1章 Go与Web应用
    rabbitMQ学习-死信队列
    Redis 笔记 01:入门篇
    探索安全之道 | 企业漏洞管理:从理念到行动
    Node.js躬行记(18)——半吊子的可视化搭建系统
    Day22:算法篇之动态回溯
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/126046233