点云处理及三维重建软件(Point Cloud Viewer, PCV)的环境搭建详细教程

本文详细指导了PCV环境的搭建过程,包括安装PCL、VTK、CMAKE、Qt5.13.2和VisualStudio2017,以及如何使用Cmake构建工程、解决DLL问题和关闭VTK警告。旨在帮助初学者快速上手并解决常见问题。

最近有同学在搭建PCV环境时遇到了一些问题来向我求助,确实这个工程涉及面比较广:PCL+QT+CPP+VS+CMAKE,所以一些没接触过相关工具的同学一时不知从何入手,特此把环境搭建教程再详细化,祝同学们都能跑通PCV。评论区里已经有同学跑通了该项目,作为一个开源爱好者,这一点足以让人欣慰。另外,本项目早已在Github开源,目的是为了让同学们少走弯路,毕竟国内相关免费软件和教程少之又少。既然是开源,所以是免费的,遇到技术问题可以找我交流讨论,本人看到了就会回复。

一,准备工作:安装相关工具库

下表为本软件所采用的技术方案,读者如果想要跑通本工程,建议参考下表:

序号技术采用方案
1编程语言C++ 11
2点云工具库PCL 1.9.1
3可视化工具库VTK 8.1
4GUI框架Qt 5.13.2
5IDE(开发环境)VS2017+Qt Creator
6编译器MSVC 2017
7运行环境Windows / Linux / Mac OS

1 安装PCL 1.9.1 和 VTK 8.1

安装PCL 1.9.1,与之对应的VTK版本为VTK 8.1 。为了便于读者复现,我上传到了优快云,该项目工程中已包含了VTK 8.1,读者可自行获取。该工具是免费的,不需要积分,大家放心下载使用:
在这里插入图片描述
这个VTK 8.1是我自己下载的,如果读者自己安装了PCL1.9.1,可以把这个目录拷过去:
在这里插入图片描述
这个dll也有用,能够去掉一些warning:
在这里插入图片描述

2 安装 Cmake

直接去CMAKE官网下载最新版
在这里插入图片描述
如果不放心,也可以用作者当前使用的版本:3.21.3
在这里插入图片描述

3 安装 Qt 5.13.2

安装教程请自行搜索,我选择了以下组件,主要是用QtCreator来搭建图形界面:
在这里插入图片描述

4 安装 Visual Studio 2017

安装教程也请自行搜索,本工程主要是使用Visual Studio 2017的编译器来构建工程。

5 检查和设置环境变量

安装上述工具后,需要检查下这些工具的环境变量有没有设置好:
在这里插入图片描述
在这里插入图片描述

二,构建PCV工程

1 从Github上获取源码

GitHub地址:point-cloud-viewer
GitCode地址:point-cloud-viewer

比如我保存在电脑的E盘:E:\QtProject\point-cloud-viewer-master
在这里插入图片描述

1 使用Cmake来构建工程

本项目使用Cmake来构建工程,首先设置源码路径和创建一个工程路径:
在这里插入图片描述
然后Cmake环境变量检查:
在这里插入图片描述
选择编译器VS2017 X64
在这里插入图片描述

在这里插入图片描述

点击generate:
在这里插入图片描述
在这里插入图片描述
至此PCV工程就构建完成了。可以在工程输出目录找到生成了VS工程的入口,如果安装成功了VS,直接双击打开:

在这里插入图片描述

2 使用VS 编写code并编译执行

构建完成后,在输出文件夹里有PointCloudViewer.sln 文件,使用VS打开即可
在这里插入图片描述
在这里插入图片描述

如果出现无法启动程序的问题,参考博文:

使用CMake+Visual Studio编译生成的项目出现无法启动程序的问题解决办法

将PointCloudViewer设为启动项目:

在这里插入图片描述
点击调试按钮开始启动:
在这里插入图片描述
总共会有三个窗口跳出来,这是正常的:
在这里插入图片描述
至此PCV就成功跑起来啦!

也可以直接在编译输出目录打开exe文件:
在这里插入图片描述

3 使用QtCreator或者VS进行二次开发

使用QtCreator打开源码的CMakeLists.txt
在这里插入图片描述

在这里插入图片描述
打开cpp文件编辑源码:
在这里插入图片描述
打开ui文件编辑界面:
在这里插入图片描述

在这里插入图片描述
或者也可以直接使用VS进行开发:
在这里插入图片描述
具体使用哪种工具,看读者的喜好。

三,补充说明

1 缺少DLL

有同学提到了复现过程中出现了缺少DLL的问题(可能是因为环境变量没设置好),参考评论区一位同学的解决方案:

  1. Cmake生成build后用vs打开
  2. 设置第二个项目为启动项
  3. 在Debug x64的模式下编译。
  4. 如果出现缺少一些dll,需要PCL191\bin目录下、PCL191\3rdParty\VTK2\bin目录下、Qt5.13.2\5.13.2\msvc2017_64\bin目录下的一些dll文件,需要把这些文件拷贝到build文件下的Debug目录下才可以正常运行。

在这里插入图片描述
实在不行,暴力一点,缺啥补啥,或者把所有DLL都拷贝到exe所在目录

2 关闭VTK warning 窗口

网上有教程,这里不再赘述。

版本适配问题

如果读者不是PCL1.9.1+VTK8.1的组合,那可能需要读者自己去摸索了,建议先用这个配置跑通,再升级工具版本。

### 将 YOLO 格式数据集换为 COCO 格式的实现 YOLOCOCO 是两种常见的目标检测数据集格式,它们之间的主要区别在于标注文件的结构和存储方式。以下是将 YOLO 格式数据集换为 COCO 格式的具体方法。 #### 1. 数据准备 在开始换之前,需要准备好以下内容: - **YOLO 格式的标签文件**:这些是以 `.txt` 文件形式存在的标注文件,位于 `labels/` 文件夹下。 - **图像文件路径列表**:用于构建 COCO 的 `images` 字段。 - **类别名称列表**:定义了数据集中包含的目标类别的名称。 #### 2. 换逻辑 COCO 格式的标注文件是一个 JSON 文件,其基本结构如下: ```json { "info": {}, "licenses": [], "categories": [ {"id": 0, "name": "class_1"}, {"id": 1, "name": "class_2"} ], "images": [ {"id": 0, "file_name": "image_1.jpg", "width": 640, "height": 480}, {"id": 1, "file_name": "image_2.jpg", "width": 640, "height": 480} ], "annotations": [ { "id": 0, "image_id": 0, "category_id": 0, "bbox": [x_min, y_min, width, height], "area": area_of_bbox, "iscrowd": 0 } ] } ``` 为了完成换,需执行以下几个操作: - 构建 `categories` 部分,基于类别名称列表生成对应的 ID 映射关系[^1]。 - 解析每张图片的信息并填充到 `images` 列表中。 - 对于每个标注文件解析边界框坐标,并将其从相对位置 (YOLO 格式) 换为绝对像素位置 (COCO 格式),最后填入 `annotations` 中。 #### 3. Python 实现脚本 下面提供了一个完整的 Python 脚本来完成上述任务: ```python import os import json from PIL import Image def convert_yolo_to_coco(yolo_labels_dir, images_dir, output_json_path, class_names): """ Convert YOLO format dataset to COCO format. :param yolo_labels_dir: Path to the directory containing .txt label files in YOLO format. :param images_dir: Path to the directory containing image files. :param output_json_path: Output path for saving the resulting COCO-format JSON file. :param class_names: List of class names corresponding to indices used in labels. """ # Initialize COCO structure coco_data = { "info": {}, "licenses": [], "categories": [{"id": idx, "name": name} for idx, name in enumerate(class_names)], "images": [], "annotations": [] } annotation_id_counter = 0 # Process each image and its associated label file for img_idx, filename in enumerate(os.listdir(images_dir)): if not filename.lower().endswith(('.png', '.jpg', '.jpeg')): continue img_path = os.path.join(images_dir, filename) img = Image.open(img_path) w, h = img.size # Add image entry coco_image_entry = { "id": img_idx, "file_name": filename, "width": w, "height": h } coco_data["images"].append(coco_image_entry) # Load corresponding label file label_filename = f"{os.path.splitext(filename)[0]}.txt" label_filepath = os.path.join(yolo_labels_dir, label_filename) if not os.path.exists(label_filepath): continue with open(label_filepath, 'r') as lbl_f: lines = lbl_f.readlines() for line in lines: parts = list(map(float, line.strip().split())) cls_id, xc_norm, yc_norm, w_norm, h_norm = map(int, parts[:1]) + parts[1:] # Convert normalized coordinates back to absolute values x_center = xc_norm * w y_center = yc_norm * h box_w = w_norm * w box_h = h_norm * h x_min = int(x_center - box_w / 2) y_min = int(y_center - box_h / 2) # Create annotation entry annotation_entry = { "id": annotation_id_counter, "image_id": img_idx, "category_id": cls_id, "bbox": [x_min, y_min, box_w, box_h], "area": box_w * box_h, "iscrowd": 0 } coco_data["annotations"].append(annotation_entry) annotation_id_counter += 1 # Save result to a JSON file with open(output_json_path, 'w') as out_f: json.dump(coco_data, out_f) if __name__ == "__main__": yolo_labels_directory = "/path/to/yolo/labels/" images_directory = "/path/to/images/" output_json_file = "/path/to/output/coco_format.json" classes_list = ["cat", "dog"] # Replace this with your actual class names. convert_yolo_to_coco( yolo_labels_dir=yolo_labels_directory, images_dir=images_directory, output_json_path=output_json_file, class_names=classes_list ) ``` 此代码实现了从 YOLO 格式COCO 格式换过程[^2]。它通过遍历所有的图片及其关联的标注文件来提取必要的信息,并按照 COCO 的标准格式重组数据。 ---
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值