点击下方卡片,关注“机器视觉与AI深度学习”
视觉/图像重磅干货,第一时间送达!
本文转载自微信公众号:数字地形分析,版权归原作者及刊载媒体所有,如有侵权请立即与我们联系,我们将及时处理。
前言
本次实验是实现的是根据无pos文件的视频文件建立3d纹理模型,在传统的摄影测量软件中(如Pix 4D),对于一般的视频文件无法进行3dmaps处理,存在两方面的问题:
(1) 相机文件缺失,无法进行缺失内外定向元素;
(2)地理定位文件缺失,无法进行处理;
图1:pix4D处理普通视频文件截图
一、Opencv库
OpenCV是一个功能强大的开源计算机视觉库,它支持多种编程语言和操作系统,提供了超过2500个优化算法,用于图像处理、视频分析、物体检测和机器学习等领域。由于其高性能和实时处理能力,OpenCV被广泛应用于面部识别、自动驾驶、机器人视觉、视频监控、医疗图像分析和增强现实等场景。开发者可以通过访问OpenCV的官方网站下载库文件,并利用其丰富的文档和社区资源进行学习和开发。Python用户可以通过pip轻松安装OpenCV的Python接口。
表1:cv库安装
二、读取视频文件
下述代码定义了一个名为 extract_frames 的函数,它的作用是从指定的视频文件中提取帧,并将这些帧作为图片保存到指定的输出文件夹中。函数接受三个参数:video_path 是视频文件的路径,output_folder 是保存提取帧的图片的文件夹路径,max_frames 是要提取的最大帧数,默认值为100。
以下是代码的详细解释:
1. 使用 cv2.VideoCapture 打开视频文件,参数是视频文件的路径。
2. 检查视频文件是否成功打开,如果没有成功打开,则打印错误信息并返回。
3. 如果输出文件夹不存在,则使用 os.makedirs 创建该文件夹。
4. 初始化 frame_count 计数器,用于跟踪提取的帧数。
5. 使用 while True 循环逐帧读取视频,直到读取到视频的末尾或达到最大帧数限制。
6. 使用 video_capture.read() 读取每一帧,如果读取失败,则打印错误信息并退出循环。
7. 使用 cv2.flip 函数将帧垂直翻转(参数180表示垂直翻转)。
8. 构建每一帧的输出文件路径,使用 os.path.join 将输出文件夹和帧编号组合成完整的文件路径。
9. 使用 cv2.imwrite 将帧保存为PNG格式的图片到输出文件夹中。
10. 打印保存的帧信息。
11. 增加 frame_count 计数器,如果达到最大帧数限制,则退出循环。
12. 使用 video_capture.release() 释放视频捕捉对象。
13. 打印完成提取帧的信息。
14. 如果在执行过程中发生异常,打印异常信息。
使用示例部分展示了如何调用 extract_frames 函数,指定了视频文件路径 video_path、输出文件夹路径 output_folder 和最大帧数 max_frames(在这个例子中限制为50帧)。
import cv2
import os
def extract_frames(video_path, output_folder, max_frames=100):
try:
# 打开视频文件
video_capture = cv2.VideoCapture(video_path)
# 检查视频是否成功打开
if not video_capture.isOpened():
print(f"Error opening video file: {video_path}")
return
# 确保输出文件夹存在,如果不存在则创建
if not os.path.exists(output_folder):
os.makedirs(output_folder)
frame_count = 0
while True:
print(f"Reading frame: {frame_count}") # 打印当前帧编号
# 逐帧读取视频
ret, frame = video_capture.read()
# 如果读取失败,退出循环
if not ret:
print(f"Failed to read frame at frame_count: {frame_count}")
break
# 翻转图像(垂直翻转)
frame = cv2.flip(frame, 180)
# 构建帧的输出文件路径
frame_filename = os.path.join(output_folder, f"frame_{frame_count:04d}.png")
# 保存帧为图片
cv2.imwrite(frame_filename, frame)
# 打印保存信息
print(f"Saved: {frame_filename}")
frame_count += 1
if frame_count >= max_frames:
break
# 释放视频捕捉对象
video_capture.release()
print("Finished extracting frames.")
except Exception as e:
print(f"An error occurred: {e}")
# 使用示例
video_path = "C:/Use/Desktop/shi/veconomy.mp4" # 输入视频文件路径
output_folder = "C:/Use /Desktop/folder"# 输出图片保存文件夹
extract_frames(video_path, output_folder, max_frames=50) # 限制读取的帧数
提取结果展示:
图2:提取结果
三、构建模型
本次处理数据的环境为3DF Zephyr Aerial 。3DF Zephyr Aerial是一款由 3Dflow 开发的专业三维建模软件,专门用于从航拍照片生成三维模型。这款软件提供了一系列的工具,专门为日常地理测量和分析、无人机/UAV 制图、建筑等领域设计。可以有效的处理无定位信息的图像。具体步骤如下所示:
(1)新建项目;在3DF Zephyr Aerial运行环境中(下同),选择菜单栏中的【工作流程】→选择【新建项目】。
图3:新建项目
(2)加载数据,设置工作格式。在【处理选项】界面,勾选【创建项目后处理三维模型】和【在线检测预处理的照片校准】。
图4:加载数据
(3)添加照片数据;在【选择照片页面】中,加载上述文件夹中每一帧的图像。
图5:添加照片
(4)相片校准;在【相机校准】页面,选择自动校正照片。
图6:相机校准
(5)设置点云重建格式;选择默认格式。
图7:相机定向和点云设置
(6)运行过程;这里可以把多余的点和面全部删掉;
图8:运行过程
(7)结果图;
(a)稀疏点云
图9:结果图
小结
通过上述过程处理,可以通过普通的视频文件生成点云数据,但对于动态物体控制点的捕捉仍然存在困难,三维纹理数据仍需要在blender软件中优化渲染。
图10:静态建筑三维纹理效果