gpt4 book ai didi

c++ - 匹配 OpenCV C++ 的 PPF 3D 模型

转载 作者:搜寻专家 更新时间:2023-10-31 00:57:47 26 4
gpt4 key购买 nike


我正在开发一个应用程序:

  1. 读取 7 个模型文件并训练 PPF 3D 检测器;
  2. 读取场景文件并尝试与检测器匹配;
  3. 将结果存储在文件中(视觉检索)。
我一直在关注 OpenCV tutorial ,但有些事情我什至阅读 documentation 也不明白:
  1. detector.match() 结果 上存储模型在场景中的姿势。但据我了解,姿势 是模型的位置和方向,但我怎么知道哪个模型是?
  2. 当我打印第一个结果的姿势时,它会给我一个 4x4 的表格,上面有浮点值。我在哪里可以找到它们的含义?
  3. 仍然是姿势打印,它给了我模型索引,起初,我以为那是我用来训练检测器的模型的编号。问题是:我使用了 7 个模型来训练检测器,第一个结果给了我“Pose to Model Index 12”。所以我认为这是 Drost(2012) 上的模型描述索引。但如果真的是模型描述索引,我怎么知道这个索引属于哪个模型呢?
  4. 根据教程,使用 transformPCPose 并将其写入 PLY 文件会给出匹配的视觉结果,但 documentation 说它返回 4x4 姿势矩阵,但我仍在打印它给了我一个超过 16 个顶点的奇怪图像,所以我不明白教程在做什么。我怎样才能像教程那样在文件上写下视觉结果?

我还读到 ICP 用于纠正任何姿势错误,但使用不带 ICP 的 PPF 可获得可接受的结果。无论如何,我尝试使用 ICP,但它总是给我“Bad argument error”。

我使用的代码如下:

void computer_vision_3d(string in_path)
{
Mat files_clouds[NUM_OF_FILES]; // > Stores the point cloud of all objects
Mat scene_cloud; // > Stores the scene point cloud
ppf_match_3d::PPF3DDetector
detector(RELATIVE_SAMPLING_STEP, RELATIVE_DISTANCE_STEP); // > Matches the model with the scene
vector<Pose3DPtr> results; // > Stores the results of the processing

// ! Phase 1 - Train Model
scene_cloud = loadPLYSimple(DEFAULT_SCENE_PATH.c_str(), PARAM_NORMALS);
for(int i = 0; i < NUM_OF_FILES; i++)
{
// . Init Point Cloud
string file_path = DEFAULT_OBJECT_PATH + to_string(i) + ".ply";
files_clouds[i] = loadPLYSimple(file_path.c_str(), PARAM_NORMALS);

// . Train Model
detector.trainModel(files_clouds[i]);
}

// ! Phase 2 - Detect from scene
detector.match( scene_cloud, results,
RELATIVE_SCENE_SAMPLE_STEP, RELATIVE_SCENE_DISTANCE);

// ! Phase 3 - Results
if(results.size() > 0)
{
Pose3DPtr result = results[0];
result->printPose();

// ! Transforms the point cloud to the model pose
for(int i = 0; i < NUM_OF_FILES; i++)
{
Mat pct = transformPCPose(files_clouds[i], result->pose);
string f_name = "match" + to_string(i) + ".ply";
writePLY(pct, f_name.c_str());
}
}

}

模型之一、场景及结果:

Figure 1 One of the seven models
图 1 - 七个模型之一。


Figure 2 The scene
图 2 - 场景。


Figure 3 The weird result
图 3 - 奇怪的结果。


最佳答案

作为该模块的作者,我想回答您的问题:

1。 detector.match() 在结果中存储模型在场景中的姿势。但据我了解,姿势是模型的位置和方向,但我怎么知道哪个模型是?

只有一个模型。所以姿势是针对同一模型的不同假设

2。当我打印第一个结果的姿势时,它会给我一个 4x4 的表格,上面有浮点值。我在哪里可以找到它们的含义?

它是 [R|t] 的增广矩阵,具有 [0,0,0,1] 的额外行以进行均质化。

3。仍然是姿势打印,它给了我模型索引,起初,我以为那是我用来训练检测器的模型的编号。问题是:我使用了 7 个模型来训练检测器,第一个结果给了我“Pose to Model Index 12”。所以我认为这是 Drost(2012) 上的模型描述索引。但如果真的是模型描述索引,我怎么知道这个索引属于哪个模型呢?

是匹配模型点(对应)的ID,不是模型id。正如我所说,不支持多个模型。

3。根据教程,使用 transformPCPose 并将其写入 PLY 文件会给出匹配的视觉结果,但文档说它返回一个 4x4 姿势矩阵,但我仍在打印它并且它给了我一个奇怪的图像更多超过 16 个顶点,所以我不明白教程在做什么。我怎样才能像教程那样将视觉结果写入文件?

该函数转换具有给定姿势的点云。如果您的姿势正确,它只会给出正确的结果。我认为您实现的 pose 结果不正确。 ICP中的“Bad argument”异常(exception)也可能是因为这个。

还有一点要注意:始终确保模型和场景具有正确朝向相机的表面法线。

关于c++ - 匹配 OpenCV C++ 的 PPF 3D 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36776557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com