尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
三维重建的步骤-1(采集的是环绕物体均匀旋转一圈的视频)
拿到手里的是环绕物体均匀旋转一圈的视频这里使用Agisoft Metashape Professional进行处理。一、抽帧1、当下载的版本支持导入视频处理的话就可以直接导入视频这里的帧步骤计算可以参考下面这个方法第1步查视频帧率 右键点击你的视频文件 → 属性 → 详细信息 → 找到 “帧速率”单位是 fps 常见值24、25、30、50、60 记下这个数字比如 30 第2步算总帧数 总帧数 视频总秒数 × 帧率 视频总秒数怎么算 比如 2分33秒 2×60 33 153秒 举例 153秒 × 30fps 4590帧总帧数 第3步算帧步骤 帧步骤 总帧数 ÷ 你想要的张数 举例 4590帧 ÷ 37张 124 → 在软件“帧步骤”里填 124然后点击ok软件就会自动进行抽帧。2、当下载的版本或电脑本身不支持导入视频处理使用代码将视频均分进行抽帧别人建议的是抽37帧但是我试过之后感觉效果不是很行所以我这里抽了60帧看着效果不好当然也可以自己调整按角度或按时间保证覆盖 360°。参考代码如下按照实际情况自行调整自己不会调整可以问问ai有什么好建议import cv2 import os import sys from pathlib import Path def extract_frames(video_path, output_folder, num_frames60): 从视频中抽取指定数量的帧 # 检查视频文件是否存在 if not os.path.exists(video_path): print(f错误: 视频文件 {video_path} 不存在) return # 创建输出文件夹 os.makedirs(output_folder, exist_okTrue) # 获取视频文件名不含扩展名 video_name Path(video_path).stem # 打开视频 cap cv2.VideoCapture(video_path) if not cap.isOpened(): print(f错误: 无法打开视频文件 {video_path}) return # 获取视频总帧数 total_frames int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) if total_frames 0: print(f错误: 视频 {video_name} 没有帧) cap.release() return print(f视频 {video_name} 总帧数: {total_frames}) # 计算采样间隔 if total_frames num_frames: frame_indices list(range(total_frames)) else: step total_frames / num_frames frame_indices [int(i * step) for i in range(num_frames)] extracted_count 0 for idx, frame_num in enumerate(frame_indices): cap.set(cv2.CAP_PROP_POS_FRAMES, frame_num) ret, frame cap.read() if not ret: print(f警告: 无法读取第 {frame_num} 帧) continue frame_filename f{video_name}_{extracted_count 1:06d}.jpg frame_path os.path.join(output_folder, frame_filename) cv2.imwrite(frame_path, frame) extracted_count 1 print(f已提取: {extracted_count}/{num_frames} 帧, end\r) cap.release() print(f\n完成! 从 {video_name} 提取了 {extracted_count} 帧到 {output_folder}) return extracted_count def process_folder(input_folder, output_base_folder, num_frames60): 处理指定文件夹中的所有MP4视频 # 检查输入路径是文件还是文件夹 if os.path.isfile(input_folder): # 如果是单个文件直接处理 if input_folder.lower().endswith(.mp4): output_folder os.path.join(output_base_folder, Path(input_folder).stem) print(f处理视频: {Path(input_folder).stem}) extract_frames(input_folder, output_folder, num_frames) else: print(f错误: {input_folder} 不是MP4文件) return # 以下是文件夹处理逻辑 if not os.path.exists(input_folder): print(f错误: 输入文件夹 {input_folder} 不存在) return video_files [] for file in os.listdir(input_folder): if file.lower().endswith(.mp4): video_files.append(os.path.join(input_folder, file)) if not video_files: print(f在 {input_folder} 中没有找到MP4文件) return print(f找到 {len(video_files)} 个MP4视频文件) os.makedirs(output_base_folder, exist_okTrue) for video_path in video_files: video_name Path(video_path).stem output_folder os.path.join(output_base_folder, video_name) print(f\n处理视频: {video_name}) extract_frames(video_path, output_folder, num_frames) def main(): # 配置参数 input_path rE:\cotton2026\test\VID_20260703_142950.mp4 # 修改为你的视频文件夹路径也可以指定单个文件 output_folder rE:\cotton2026\pic # 修改为输出文件夹路径 frames_to_extract 60 # 要抽取的帧数 # 如果提供了命令行参数 if len(sys.argv) 1: input_path sys.argv[1] if len(sys.argv) 2: output_folder sys.argv[2] if len(sys.argv) 3: try: frames_to_extract int(sys.argv[3]) except ValueError: print(帧数必须是整数使用默认值60) print(f输入路径: {input_path}) print(f输出文件夹: {output_folder}) print(f每视频抽帧数: {frames_to_extract}) process_folder(input_path, output_folder, frames_to_extract) if __name__ __main__: main()二、对齐照片工作流程-对齐照片对齐之后就会看到下面这样的样子首先需要确保一圈都有一帧这样才没有缺失但是也不能保证它能重建完全还需后续的调整。生成这种小点之后可以删除掉不需要的点出现上面的这种帧也圈红了的情况就不行这个应该是需要留着的。删完之后点击“工作流程-生成模型”三、生成点云“工作流程-生成点云”看着能生成密集点云就可以。至少生成的点云保证能看到茎和叶。这个结果可以在下面这个里面找上面的这个是我还没删除完全生成的点云效果也不是很好只是作为一个使用软件的举例但是最好是试试其他的帧数还能不能更全面。最后导出.ply文件。ok,这个就先这样。
RELATED

相关推荐

以太网高可用方案:网络架构、IP规划与Keepalived VIP漂移实录

以太网高可用方案:网络架构、IP规划与Keepalived VIP漂移实录

前几天还有个朋友问我,说他们内网系统要做高可用,是不是必须得上一台硬件负载均衡设备?我跟他讲,很多时候不用那么折腾,传统的Ethernet以太网加上合理的IP规划和VIP(虚拟IP)方案,就能…

📅 2026/10/21 5:00:56
Claude Code插件市场搭建指南:从JSON目录到Git分发实践

Claude Code插件市场搭建指南:从JSON目录到Git分发实践

说实话,我最初接触"Claude Code 插件市场"这个概念时,下意识以为要搭一个类似 VS Code 插件商店的网页平台,要设计推荐算法、审核后台、用户体系那一整套。真正动手做下去才发现,事情远没有那么复杂,但也没有…

📅 2026/10/21 4:55:56
lingbot-map实战:机器人导航地图的格式统一与坐标对齐

lingbot-map实战:机器人导航地图的格式统一与坐标对齐

做机器人导航的人,迟早会被地图这件事折磨一遍。最开始我以为地图就是一张图片,顶多分辨率高点、画得清楚点,后来在实际项目里才发现,地图在导航系统里同时扮演着数据结构、坐标系基准、实时变量和调参噩梦四个角色。lingbot-map就…

📅 2026/10/21 4:55:56
MORE NEWS

更多资讯

📰

sentry_drift鸿蒙化适配:Flutter数据库级性能追踪

不是标题起得唬人,是这个问题确实绕不开。我最近在一个模拟的 Flutter 跨端项目里做性能治理,页面滑动掉帧、接口返回慢这些常规问题排查完之后,发现一个更隐蔽的瓶颈——数据库层面的慢查询。SQLite 操作本身可能只有几十毫秒,但…

📰

VS Code 高效开发实战:从安装配置到插件调试完整指南

这份学习笔记,来自我在多个项目中从“只会打开文件写代码”到“能把一整套开发流程顺畅跑通”的真实积累。VS Code 的强大不在于它默认带了多少功能,而在于它把编辑器、终端、调试器、版本控制这些高频操作,用一套可配置的框架融合在了一起。…

📰

AI调度官真的能管好团队?从拆目标到团建的三周实测拆解

我一直对“让智能体管团队”这件事嗤之以鼻。市面上的AI工具我试过不少:有的能生成任务清单,有的会自动回复消息,可真让它去拆周目标、分派活、催进度、协调资源,它基本就成了一个“高级复读机”。开会、排期、团建这些事&#xf…

📰

智能体技能体系设计:从提示词到可复用能力单元

1. 从"技能"这个词说起:为什么智能体需要一套技能体系第一次看到"agent-skills"这个命名,我脑子里冒出来的第一个念头是:这不就是把智能体当成一个"新员工"来培养吗?你招一个人进来,他光…

📰

GPT-4o API接入实战:认证、流式输出与工程优化全攻略

2. 调用核心机制与参数配置其实说“解锁”,对于大部分开发者来说,真正要解决的是两件事:第一,怎么拿到合法的调用凭证;第二,怎么把请求封装得又快又稳。这一节我把这两块展开讲透。2.1 认证机制与请求流程G…

📰

CactiEZ实战:华为、H3C、中兴交换机SNMP监控模板导入与排错

简介:面向CactiEZ 10.1监控平台用户,这份资源提供了一套开箱即用的主机监控模板包,专门解决网络运维人员在纳管华为、中兴、H3C等设备时手动编写SNMP模板的麻烦,也适用于需要同时监控UPS、打印机等辅助设备的机房场景。包内共16个…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬