使用Python基于opencv实现多视频画面拼接融合算法demo

这篇具有很好参考价值的文章主要介绍了使用Python基于opencv实现多视频画面拼接融合算法demo。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

综述

单个相机视频画面尺寸有限,在需要全景展示的场景下,就需要将多个相机视频进行拼接融合,得到一张全景图。本文基于opencv实现一个视频拼接的demo,熟悉视频拼接流程和opencv接口。

demo

直接上代码吧,注释还是比较清楚的:

import cv2  
import numpy as np  
  
#print(cv2.getBuildInformation())

# 加载两个视频  
cap1 = cv2.VideoCapture('m1.MOV')  
cap2 = cv2.VideoCapture('m2.MOV')  

if(cap1.isOpened() == False | cap2.isOpened()==False):
    print("Opening video stream fail.")
  
# 获取视频帧速率  
fps = cap1.get(cv2.CAP_PROP_FPS)  
  
# 初始化视频帧索引  
frame_index = 0  
  
while True:  
    # 读取视频帧  
    ret1, frame1 = cap1.read()  
    ret2, frame2 = cap2.read()  
  
    if not ret1 or not ret2:  
        break  
  
    # 确保两个视频帧的索引相等  
    if frame_index % fps == 0:  
        # 转换为灰度图像  
        gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)  
        gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)  
  
        # 使用ORB算法检测关键点  
        orb = cv2.ORB_create()  
        keypoints1, descriptors1 = orb.detectAndCompute(gray1, None)  
        keypoints2, descriptors2 = orb.detectAndCompute(gray2, None)  
  
        # 使用BFMatcher进行匹配  
        bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)  
        matches = bf.match(descriptors1, descriptors2)  
  
        # 按照距离排序并保留最佳匹配点对  
        matches = sorted(matches, key=lambda x: x.distance)  
        if len(matches) > 10:  
            # 计算单应性矩阵并应用图像变换  
            src_pts = np.float32([keypoints1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)  
            dst_pts = np.float32([keypoints2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)  
            M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)  
            matchesMask = mask.ravel().tolist()  
  
            # 使用单应性矩阵对第一帧进行变换  
            h, w = frame1.shape[:2]  
            frame1_transformed = cv2.warpPerspective(frame1, M, (w, h))  
  
            # 将变换后的帧与第二帧进行混合  
            result = cv2.addWeighted(frame1_transformed, 0.5, frame2, 0.5, 0.0)  
            cv2.imshow('Aligned Videos', result)  
            cv2.waitKey(1)  
  
    frame_index += 1  
  
# 释放视频资源并关闭窗口  
cap1.release()  
cap2.release()  
cv2.destroyAllWindows()

该demo使用ORB算法检测关键点,使用BFMatcher进行特征匹配,然后使用RANSAC算法估计单应性矩阵,最后使用透视变换将第二个视频帧与第一个视频帧对齐。你可以根据需要调整参数来优化算法的性能。

结论

本人实测,ORB算法实时性还是比较好的,但是拼接结果一言难尽,可能还需要根据使用场景深入优化。

注:

        关于VideoCapture,这里我得多说道几句,因为它困扰了我一天时间!

问题:直接运行上述代码cap1 = cv2.VideoCapture('m1.MOV') 报错

OpenCV: Couldn't read video stream from file "m11.MOV"

第一步:当然说检查文件名+文件路径

文件名正确,文件路径和demo代码在同一目录

问题还在!

第二步:网上查吧

网上查了一堆答案,都是说要安装对应的解码器

好的,安装ffmpeg,打印opencv配置表,安装成功,仍然报上述错误!

第三步:没思路?那就变着花样在网上查吧

终于,还是在官方说明中找到了答案。官方还是牛B的!

官方说明原文:

Pitfall: If the video file you are reading is in the same folder as your code, 
simply specify the correct file name. 
Else, you would have to specify the complete path to the video file.

也就是说:如果代码和视频文件中同一目录,直接传文件名即可,如果不在同一目录,那就需要传完整路径。

嗯,知道问题在哪了吧,还是路径问题!

哎?好像不对啊,我就是同一目录,传的正确文件名啊!

好像也是哦,前面好像吹官方吹早了,嘿嘿。。。

不过不要紧,官方虽然没直接解决问题,但提供了灵感:完整路径!

是的,直接改成完整路径就好了!!!

总结:

好吧,我发誓,以后遇到这种问题,不管三七二十一,先填个十五再说!

哦,不对,是先改成完整路径再说!文章来源地址https://www.toymoban.com/news/detail-762744.html

到了这里,关于使用Python基于opencv实现多视频画面拼接融合算法demo的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV进阶 — 图像拼接和图像融合技术

    图像拼接在实际的应用场景很广,比如无人机航拍,遥感图像等等,图像拼接是进一步做图像理解基础步骤,拼接效果的好坏直接影响接下来的工作,所以一个好的图像拼接算法非常重要。 再举一个身边的例子吧,你用你的手机对某一场景拍照,但是你没有办法一次将所有你

    2024年02月03日
    浏览(26)
  • 视频拼接融合产品的产品与架构设计(一)

    将多达8个视频拼接在一起,拼成上帝视角的大图,并且可以共享最终生成的画面。 三维方案是我在晚上思考的时候无意想到,这种方案应该是最接近事实的方案,多个画面应该是在三个维度,x,y,z 上面进行缩放,平移,旋转吗,可以形成柱面立体的图像,而底座的平面不

    2024年02月12日
    浏览(30)
  • 基于Django websocket实现视频画面的实时传输案例

    📌本案例是基于B/S架构的视频监控画面的实时传输,使用django作为服务端的开发框架。 Django Channels 是一个用于在 Django 框架中实现实时、异步通信的扩展库。传统的 Django 是基于请求-响应模式的,每个请求都会经过 Django 的视图函数进行处理并返回响应。而 Channels 提供了基

    2024年02月04日
    浏览(35)
  • 解决OpenCV使用USB摄像头获取高分辨率视频低帧率、卡、果冻画面的问题

    最近制作移动设备,需要安置多个usb摄像头到电脑,踩了几个坑,记录一下解决方案。 不能使用分线器插多个usb摄像头,同一时间只能加载一个。 usb摄像头调高分辨率时,非常卡顿,视频画面像果冻一样,及不流畅 第二个情况具体描述: 摄像头支持1920*1080  60fps,opencv在

    2024年02月16日
    浏览(56)
  • Python 结合opencv实现图片截取和拼接

    python 3.6.2 scikit-build-0.16.7 win10 opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 下载地址: https://pypi.org/project/opencv-python/4.5.4.60/#files https://files.pythonhosted.org/packages/57/6c/7f4f56b2555d5c25dd4f41fc72a16dc6402cb2b4f967da11d8d26c669b55/opencv_python-4.5.4.60-cp36-cp36m-win_amd64.whl 注意:下载时不用下abi版的,比如 o

    2024年02月08日
    浏览(33)
  • 【快速阅读三】使用泊松融合实现单幅图的无缝拼贴及消除两幅图片直接的拼接缝隙。

    在【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化 一文的最后,我曾经提到有个使用泊松融合来来实现Seamless Tiling的效果,我自己尝试去实现,暂时没有获取正确的结果,论文里给出的效果如下:                                    

    2024年01月19日
    浏览(52)
  • 海康威视摄像头二次开发_云台控制_视频画面实时预览(基于Qt实现)

    需求:需要在公司的产品里集成海康威视摄像头的SDK,用于控制海康威视的摄像头。 拍照抓图、视频录制、云台控制、视频实时预览等等功能。 开发环境: windows-X64(系统) + Qt5.12.6(Qt版本) + MSVC2017_X64(使用的编译器) 海康威视提供了 设备网络SDK ,设备网络SDK是基于设备私有网

    2024年02月13日
    浏览(35)
  • Python + OpenCV一步一步地实现图像拼接(原理与代码)

    图像拼接可以理解为三大步: 按顺序读取多幅图像,并保证图像按照从左到右的顺序。 发现这些图像像素之间的相关性(涉及到 单应性 )。 将这些图像拼接成为一张全景图像。 首先,需要了解如下几个概念。 Python OpenCV SIFT特征提取的原理与代码实现_乔卿的博客-CSDN博客

    2024年02月04日
    浏览(40)
  • 海思Hi3403V100方案双目视频拼接融合模组+海思Hi3519DV500方案1200万无人机吊舱套板

    海思Hi3403V100方案双目视频拼接融合模组 Hi3403V100是海思面向高端市场应用推出的专业 Ultra-HD Smart IP Camera SOC,该芯片最高支持四路sensor输入,支持最高4K60的ISP图像处理能力。 海思Hi3403V100方案双目视频模组采用了海思Hi3403V100方案核心板+双目视频融合IMX334 Sensor板测试,端侧软

    2024年04月23日
    浏览(35)
  • Unity使用OpenCV插件实现人脸融合 —— 换脸换装示例

    本章节针对部分网友提出的看不懂源码,拿到相关资料后这也报错,那也有报错,要求提供一个付费源码工程,来咯来咯来咯,今天就写一章专门针对换脸换装的小白级操作案例; Unity版本我这儿使用的是2020.3.25,VS2022,然后涉及到的三个插件: OpenCV for Unity2.4.7.unitypackage ,

    2024年01月17日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包