如何通过视频建立3d模型

news2024/10/27 20:32:28

通过视频建立3D模型通常包括几个关键步骤:从视频中提取帧、对帧中的物体进行特征提取、将多帧中的信息结合起来恢复三维结构。Python中有一些库和工具可以帮助实现这个过程,例如OpenCV、Open3D、COLMAP等。以下是一个简化的流程和代码框架:

 步骤概述

1. 从视频中提取帧:利用OpenCV从视频中逐帧提取图像。
2. 特征提取与匹配:使用SIFT(Scale-Invariant Feature Transform)或ORB(Oriented FAST and Rotated BRIEF)等算法提取图像特征,并匹配相邻帧的特征。
3. 计算相机位姿:利用图像特征计算相机在空间中的运动。
4. 三角化恢复3D点云:通过多视角的图像特征来三角化3D点。
5. 重建3D模型:将点云转化为可视化的3D模型。

实现步骤

 1. 从视频中提取帧
import cv2

def extract_frames(video_path, output_dir):
    cap = cv2.VideoCapture(video_path)
    frame_count = 0
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        frame_path = f"{output_dir}/frame_{frame_count:04d}.png"
        cv2.imwrite(frame_path, frame)
        frame_count += 1
    cap.release()

#使用示例
extract_frames('input_video.mp4', 'output_frames')

 2. 特征提取与匹配

import cv2

def detect_and_match_features(img1, img2):
    # 使用ORB特征检测
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(img1, None)
    kp2, des2 = orb.detectAndCompute(img2, None)

    # 使用Brute-Force匹配
    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(des1, des2)
    matches = sorted(matches, key=lambda x: x.distance)

    # 绘制匹配结果
    img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    cv2.imshow("Matches", img_matches)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    return kp1, kp2, matches

# 示例
img1 = cv2.imread('output_frames/frame_0000.png', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('output_frames/frame_0001.png', cv2.IMREAD_GRAYSCALE)
detect_and_match_features(img1, img2)


 

3. 计算相机位姿
import numpy as np

def compute_camera_pose(kp1, kp2, matches, K):
    # 从匹配的关键点中提取坐标
    pts1 = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 1, 2)
    pts2 = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 1, 2)

    # 计算本质矩阵
    E, mask = cv2.findEssentialMat(pts1, pts2, K)

    # 恢复相机位姿
    _, R, t, _ = cv2.recoverPose(E, pts1, pts2, K)
    
    return R, t

# 示例相机内参矩阵
K = np.array([[1000, 0, 640],
              [0, 1000, 360],
              [0, 0, 1]])

# 示例调用
kp1, kp2, matches = detect_and_match_features(img1, img2)
R, t = compute_camera_pose(kp1, kp2, matches, K)
print("Rotation Matrix:\n", R)
print("Translation Vector:\n", t)
4. 三角化恢复3D点云

def triangulate_points(kp1, kp2, matches, K, R, t):
    pts1 = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1, 2)
    pts2 = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1, 2)

    # 将像素坐标转换为归一化图像坐标
    pts1_norm = cv2.undistortPoints(np.expand_dims(pts1, axis=1), K, None)
    pts2_norm = cv2.undistortPoints(np.expand_dims(pts2, axis=1), K, None)

    # 相机投影矩阵
    P1 = np.hstack((np.eye(3), np.zeros((3, 1))))
    P2 = np.hstack((R, t))

    # 三角化点
    points_4d_hom = cv2.triangulatePoints(P1, P2, pts1_norm, pts2_norm)
    points_3d = points_4d_hom[:3] / points_4d_hom[3]
    return points_3d.T

# 示例调用
points_3d = triangulate_points(kp1, kp2, matches, K, R, t)
print("3D Points:\n", points_3d)


 

 5. 使用Open3D展示3D点云

import open3d as o3d
import numpy as np

def visualize_point_cloud(points):
    # 创建点云对象
    pcd = o3d.geometry.PointCloud()
    pcd.points = o3d.utility.Vector3dVector(points)
    
    # 可视化点云
    o3d.visualization.draw_geometries([pcd])

# 示例调用
visualize_point_cloud(points_3d)


 

 总结

1. 从视频中提取帧并进行特征匹配。
2. 使用这些匹配特征来估计相机的相对位姿。
3. 使用相机位姿和匹配特征三角化出3D点。
4. 最后用Open3D库可视化生成的3D点云。

这是一个基础的Python框架,可以在此基础上进行优化和扩展,例如加入更多的图像处理技术或使用更高级的3D重建算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2224904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

量子计算突破:下一个科技革命的风口浪尖在哪里?

内容概要 在当今科技飞速发展的时代,量子计算如同一颗璀璨的明珠,正闪烁着无尽的可能性。它不仅是解决科学难题的钥匙,更是即将引领科技革命的先锋。如今,随着技术的不断突破,量子计算已经步入了一个崭新的阶段。想象…

使用React构建现代Web应用

💖 博客主页:瑕疵的CSDN主页 💻 Gitee主页:瑕疵的gitee主页 🚀 文章专栏:《热点资讯》 使用React构建现代Web应用 1 引言 2 React简介 3 安装React 4 创建React项目 5 设计应用结构 6 创建组件 7 使用组件…

Docker本地安装Minio对象存储

Docker本地安装Minio对象存储 1. 什么是 MinIO? MinIO 是一个开源的对象存储服务器。这意味着它允许你在互联网上存储大量数据,比如文件、图片、视频等,而不需要依赖传统的文件系统。MinIO 的特点在于它非常灵活、易于使用,同时…

【ruoyi-vue】ruoyi-vue 去掉数据库和redis

场景:采用ruoyi-vue作为一个简单的后台框架,不需要使用数据库,redis。因此采取以下方法去掉相关配置,防止启动时造成数据和redis不存在的报错。 1、去掉数据库 注释掉framework下的DruidConfig.java 2、去掉部分数据启动时的初…

将公有云变成本地磁盘的几种方式

因为微信更改了推送机制,不按照号主发文时间排序了。现在的规则是综合多种因素,你可能在今天收到昨天的推送,甚至前天的! 如果你认可菜鸟小白的学习分享的话,就星标一下吧,只需要两步! 这样你可…

猫头虎 分享:Python库 Click 的简介、安装、用法详解入门教程

🐯 猫头虎 分享:Python库 Click 的简介、安装、用法详解入门教程 今天猫头虎带您一起探索 Click 库!最近有位粉丝私信猫哥,问到在项目中如何用 Python 简单又高效地实现命令行工具。大家熟悉的 argparse 虽然功能齐全&#xff0c…

深入理解gPTP时间同步过程

泛化精确时间协议(gPTP)是一个用于实现精确时间同步的协议,特别适用于分布式系统中需要高度协调的操作,比如汽车电子、工业自动化等。 gPTP通过同步主节点(Time Master)和从节点(Time Slave)的时钟,实现全局一致的时间参考。 以下是gPTP实现主从时间同步的详细过程:…

WaveNet模型实现电力预测

项目源码获取方式见文章末尾! 回复暗号:13,免费获取600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【EfficientNet-B6模型实现ISIC皮肤镜图像数据集分类】 2.【卫星图像道路检测De…

GeoWebCache1.26调用ArcGIS切片

常用网址: GeoServer GeoWebCache (osgeo.org) GeoServer 用户手册 — GeoServer 2.20.x 用户手册 一、版本需要适配:Geoserver与GeoWebCache、jdk等的版本适配对照 ​ 查看来源 二、准备工作 1、数据:Arcgis标准的切片,通过…

安全芯片 OPTIGA TRUST M 使用介绍与示例(基于STM32裸机)

文章目录 目的资料索引硬件电路软件框架介绍数据存储框架移植框架使用 使用示例示例地址与硬件连接通讯测试功能测试 总结 目的 OPTIGA TRUST M 是英飞凌推出的安全芯片,芯片通提供了很多 slot ,用于存放各类安全证书、密钥、用户数据等,内置…

飞书文档解除复制限制

解除飞书文档没有编辑器权限限制复制功能方法 方法一:使用插件 方法二: 通过调试工具删除所有的copy事件 使用插件 缺点: 只有markdown格式,如果需要其他格式需要再通过Typora等markdown编辑器转pdf,word等格式 安装插件 Cloud Do…

Day02回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 …

关于 Linux 内核“合规要求”与俄罗斯制裁的一些澄清

原文:Michael Larabel - 2024.10.24 当 一些俄罗斯的 Linux 开发者被从内核的 MAINTAINERS 文件中移除 时,原因被描述为“合规要求”,但并未明确这些要求具体涉及什么内容。随后,Linus Torvalds 对此发表了评论,明确指…

便捷之选:微信小程序驱动的停车场管理系统

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

2024最新版 Tomcat安装与配置(带图详细步骤)简单易懂

官方网站: Apache Tomcat - 欢迎! 一、选择下载版本(本文选择tomcat 9版本为例) 二、找到你下载压缩包的位置,进行解压 三、配置环境 1)新建系统变量,变量名为: CATALINA_HOME 变…

GoogleChrome和Edge浏览器闪屏问题

GoogleChrome和Edge浏览器闪屏问题 文章目录 GoogleChrome和Edge浏览器闪屏问题 买了电脑半年, GoogleChrome和edge浏览器出现了一个令人头疼的问题–闪屏, 就是打开这两个浏览器之后, 就会出现电脑屏幕一闪一闪的, 过一会就看不见了, 跟黑夜里的闪电一样, 遇到这种情况我都会直…

Unbounded:一个无限生成式交互的角色生活模拟游戏

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦! 🥦 微信公众号&#xff…

安全知识见闻-网络类型、协议、设备、安全

网络类型、协议、设备、安全 本章节包括局域网(LAN)、城域网(MAN)和广域网(WAN)。此外,还涉及了网络协议、网络设备和网络安全的基本概念。 目录 网络类型、协议、设备、安全 一、网络类型 …

vue使用阿里svg图标

最近开发项目的写前端时候,发现element的图标库不能满足我的需求,当然,大部分是够用的,不过某些特定按钮没有合适的图标,我是发现没有批量导入按钮的图标,所以找了阿里的适量图标库来使用 阿里矢量图标库 阿里矢量图…

241026-RHEL如何以root身份卸载Docker

在 RHEL 8.8 中,以 root 身份卸载 Docker 可以通过以下步骤完成: 停止 Docker 服务(如果已启动): sudo systemctl stop docker删除 Docker 包: 运行以下命令卸载 Docker 引擎及其依赖包(docker-…