Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ PPF 3D模型匹配OpenCV C++;_C++_Opencv_3d_Computer Vision_Mesh - Fatal编程技术网

C++ PPF 3D模型匹配OpenCV C++;

C++ PPF 3D模型匹配OpenCV C++;,c++,opencv,3d,computer-vision,mesh,C++,Opencv,3d,Computer Vision,Mesh,我正在开发一个应用程序: 读取7个模型文件并训练PPF 3D探测器 读取场景文件并尝试与检测器匹配 将结果存储在文件中(可视化检索) 我一直在关注,但有几件事我甚至在阅读时都不明白: 检测器.match()在结果中存储模型在场景中的姿势。但据我所知,姿势是模型的位置和方向,但我如何知道哪个模型是 当我打印第一个结果的姿势时,它会给我一个4x4表格,上面有浮点值。我在哪里可以找到它们的意思 仍然是姿势打印,它给了我模型索引,起初,我认为这是我用来训练探测器的模型的编号。问题是:我使用了7个模型来训


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

  • 读取7个模型文件并训练PPF 3D探测器
  • 读取场景文件并尝试与检测器匹配
  • 将结果存储在文件中(可视化检索)
  • 我一直在关注,但有几件事我甚至在阅读时都不明白:

  • 检测器.match()结果中存储模型在场景中的姿势。但据我所知,姿势是模型的位置和方向,但我如何知道哪个模型是
  • 当我打印第一个结果的姿势时,它会给我一个4x4表格,上面有浮点值。我在哪里可以找到它们的意思
  • 仍然是姿势打印,它给了我模型索引,起初,我认为这是我用来训练探测器的模型的编号。问题是:我使用了7个模型来训练探测器,第一个结果是“姿势到模型索引12”。因此,我认为这是模型描述索引,因为它是在(2012年)。但是如果它真的是模型描述索引,我怎么知道这个索引属于哪个模型呢
  • 根据教程,使用transformPCPose并将其写入PLY文件将给出匹配的视觉结果,但该文件说它返回4x4姿势矩阵,但我仍在打印它,它给了我一个包含16个以上顶点的奇怪图像,因此我不明白教程在做什么。如何像教程那样将可视化结果写入文件 我还了解到,ICP用于纠正任何姿势错误,但在不使用ICP的情况下使用PPF会给出可接受的结果。无论如何,我尝试使用ICP,但它总是给我“坏的参数错误”

    我使用的代码写在下面:

    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());
            }
        }
    
    }
    
    void computer\u vision\u 3d(路径中的字符串)
    {
    Mat files_clouds[NUM_OF_files];/>存储所有对象的点云
    Mat scene_cloud;/>存储场景点云
    ppf_匹配_3d::PPF3DDetector
    检测器(相对采样步长、相对距离步长);/>将模型与场景匹配
    矢量结果;//>存储处理结果
    //!第1阶段-列车模型
    scene_cloud=loadPLYSimple(默认的_scene_PATH.c_str(),参数为法线);
    for(int i=0;i0)
    {
    Pose3DPtr结果=结果[0];
    结果->打印姿势();
    //!将点云变换为模型姿势
    for(int i=0;i姿势);
    字符串f_name=“match”+到字符串(i)+“.ply”;
    writePLY(pct,f_name.c_str());
    }
    }
    }
    
    其中一个模型、场景和结果:


    图1-七种模型之一



    图2-场景。




    图3-奇怪的结果。


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

    一,。detector.match()将模型在场景中的姿势存储在结果中。但据我所知,姿势是模型的位置和方向,但我如何知道哪个模型是

    只有一个模型。因此,姿势是针对同一模型的不同假设

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

    它是一个[R | t]的增广矩阵,额外的[0,0,0,1]行用于均匀化

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

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

    三,。根据教程,使用transformPCPose并将其写入PLY文件将给出匹配的视觉结果,但文档中说它返回4x4姿势矩阵,但我仍在打印它,它给了我一个包含16个以上顶点的奇怪图像,所以我不明白教程在做什么。如何像教程那样将可视化结果写入文件

    该函数用于变换具有给定姿势的点云。只有当你的姿势正确时,它才会给出正确的结果。我认为你实施的结果是不正确的。国际比较项目中的“坏论点”例外也可能是因为这个原因


    还有一个注意事项:始终确保模型和场景具有曲面法线,这些法线正确朝向摄影机。

    谢谢!当我问这个问题时,我从计算机视觉上看不太明白,现在我明白了一点,我发现我做了很多错事……你能扩展一下“正确朝向相机”吗?我看到您在计算法线之前设置了视点(在计算法线的示例代码中),但是曲面法线如何与摄影机视点相关?好问题。检查“理论底漆”部分的末端:Ok,u