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

devtools/2024/10/27 23:01:07/

通过视频建立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 cv2def extract_frames(video_path, output_dir):cap = cv2.VideoCapture(video_path)frame_count = 0while cap.isOpened():ret, frame = cap.read()if not ret:breakframe_path = f"{output_dir}/frame_{frame_count:04d}.png"cv2.imwrite(frame_path, frame)frame_count += 1cap.release()#使用示例
extract_frames('input_video.mp4', 'output_frames')

 2. 特征提取与匹配

import cv2def 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 npdef 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 npdef 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.ppmy.cn/devtools/129288.html

相关文章

Python数据分析——Numpy

纯个人python的一个小回忆笔记,当时假期花两天学的python,确实时隔几个月快忘光了,为了应付作业才回忆起来,不涉及太多基础,适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频: 一…

Sql执行较慢的排查方式

SQL执行较慢的排查方式涉及多个方面,包括检查SQL语句本身、数据库配置、硬件资源等。以下是一些具体的排查步骤和优化建议: 一、检查SQL语句 启用慢查询日志: 大多数数据库管理系统(如MySQL、PostgreSQL)都支持慢查询…

Konva 组,层级

代码&#xff1a; <template><div class"rect"><div class"header"> <!-- <el-button type"primary" click"show">展示</el-button>--> <!-- <el-button type"success&quo…

flask基于python的动漫插画分享网站django毕业设计项目

目录 具体实现截图技术栈预期达到的目标开发技术介绍论文大纲目 录编码规范核心代码部分展示其他项目推荐详细视频演示源码获取方式 具体实现截图 技术栈 Python也提供了数据库的操作接口&#xff0c;通过引入Python的MySQL处理对象连接数据库后&#xff0c;使用通用的SQL语句…

字符串使用方法:

字符串: -- 拼接字符串 SELECT CONCAT(糯米,啊啊啊撒,删掉); -- 字符长度 SELECT LENGTH(asssssssggg); -- 转大写 SELECT UPPER(asdf); -- 转小写 SELECT LOWER(ASDFG); -- 去除左边空格 SELECT LTRIM( aaaasdrf ); -- 去除右边空格 SELECT RTRIM( aaaasdff ); -- 去除两端…

Redis 事务 总结

前言 相关系列 《Redis & 目录》&#xff08;持续更新&#xff09;《Redis & 事务 & 源码》&#xff08;学习过程/多有漏误/仅作参考/不再更新&#xff09;《Redis & 事务 & 总结》&#xff08;学习总结/最新最准/持续更新&#xff09;《Redis & 事务…

InternVL-1.1: Enhance Chinese and OCR Capabilities

Blog:https://internvl.github.io/blog/2024-01-24-InternVL-1.1/ 指南:https://internvl.readthedocs.io/en/latest/internvl1.1/introduction.html InternVL-Chat-V1-1 结构类似于 LLaVA,包括一个 ViT、一个 MLP 投影器和一个 LLM。如上图所示,我们通过一个简单的 MLP …

2024年网络安全(黑客技术)三个月自学手册

&#x1f91f; 基于入门网络安全/黑客打造的&#xff1a;&#x1f449;黑客&网络安全入门&进阶学习资源包 前言 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、…