干货 | OpenCV库处理视频文件,并对照片进行三维建模

2024-10-17 08:30   重庆  

点击下方卡片,关注“机器视觉与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 cv2import osdef 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:静态建筑三维纹理效果


—THE END—

觉得有用,麻烦给个赞和在看 

机器视觉与AI深度学习
专注于机器视觉、AI、深度学习等技术最新资讯、实战内容及应用案例的分享,交流!
 最新文章