『点云识别』隐性模型ISM(Implicit Shape Model)

2024-01-24 15:20

本文主要是介绍『点云识别』隐性模型ISM(Implicit Shape Model),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是隐性模型(ISM)?

当涉及到目标识别和检测时,隐式形状模型(ISM)是一种常用的方法。ISM通过分析目标的形状特征来辨别目标

首先,用点云数据来表示目标的外形。点云数据就像是许多离散点的集合,每个点都有自己的位置信息。

然后,我们从这些点云数据中提取出一些有用的局部几何特征,比如点的法线方向、曲率等。这些特征能够告诉我们有关目标的形状信息。

接下来,我们将这些局部几何特征组合成特征向量,并用一种方法将其降低到较低的维度。这样做是为了减少计算负担并且更好地表示目标的形状。

然后,我们使用这些特征向量来构建一个“代码本”。代码本就像是一个由许多特征向量组成的库,而每个特征向量都代表了一个特定的目标类别。

最后,当我们有新的点云数据时,我们可以将其特征向量与代码本中的向量进行比较。通过计算它们之间的距离,我们可以判断新的点云数据是否属于某个特定的目标类别。

ISM的优点在于它可以很好地建模目标的形状特征,并且对噪声和数据缺失较为鲁棒。此外,ISM方法还相对高效。

然而,ISM在处理复杂场景中的目标识别可能会面临一些挑战,比如相似目标的区分、遮挡、观察角度变化等。

隐性模型与基于对应分组的方法的区别

ISM方法主要关注物体的形状特征,它使用点云数据中的局部几何特征来描述物体的形状。这些局部特征可以包括点的法线方向、曲率等。ISM通过将这些特征组合成特征向量,并构建一个代码本来表示物体形状。然后,通过比较输入点云与代码本中的特征向量来进行物体识别。

基于对应分组的方法更关注点云中点之间的对应关系。它尝试找到点云中的点与其他点之间的配对关系,并利用这些对应关系来识别物体。这可以通过计算点对之间的距离或相似度来完成。

总的来说,ISM方法主要依靠特征向量和代码本进行物体识别,而基于对应分组的方法主要依靠点云中点的对应关系进行识别。

这两种方法各有优劣,适用于不同的应用场景。选择适合的方法取决于具体的需求和数据特点。

代码

#include <iostream>
#include <pcl/io/pcd_io.h>#include <pcl/features/normal_3d.h>
#include <pcl/features/feature.h>#include <pcl/visualization/cloud_viewer.h>
#include <pcl/features/fpfh.h>
#include <pcl/features/impl/fpfh.hpp>#include <pcl/recognition/implicit_shape_model.h>
#include <pcl/recognition/impl/implicit_shape_model.hpp>int main(){pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> normal_estimator; // 法线估计类normal_estimator.setRadiusSearch(25.0);std::vector<pcl::PointCloud<pcl::PointXYZ>::Ptr> training_clouds; // 用于存储所有的训练点云std::vector<pcl::PointCloud<pcl::Normal>::Ptr> training_normals; // 用于存储 训练点云的 法线特征std::vector<unsigned int> training_classes; // 训练地点云对应的类别std::vector<std::string> files;files.push_back("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_train_cat.pcd");files.push_back("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_train_horse.pcd");
//    files.push_back("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_train_michael.pcd");
//    files.push_back("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_train_wolf.pcd");
//    files.push_back("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_train_lioness.pcd");// 对训练数据点云 提取 法线特征for (size_t i = 0; i<files.size(); i++){pcl::PointCloud<pcl::PointXYZ>::Ptr tr_cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>(files[0], *tr_cloud) == -1)return -1;pcl::PointCloud<pcl::Normal>::Ptr tr_normals(new pcl::PointCloud<pcl::Normal>);normal_estimator.setInputCloud(tr_cloud);normal_estimator.compute(*tr_normals);unsigned int tr_class = i;training_clouds.push_back(tr_cloud);training_normals.push_back(tr_normals);training_classes.push_back(tr_class);}// 隐式模型的训练和保存pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153>>::Ptr fpfh(new pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::Histogram<153>>); // 创建FPFHEstimation对象,用于估计FPFH特征fpfh->setRadiusSearch(30.0); // 设置搜索半径pcl::Feature<pcl::PointXYZ, pcl::Histogram<153>>::Ptr feature_estimate(fpfh); // 创建用于特征估计的Feature对象pcl::ism::ImplicitShapeModelEstimation<153, pcl::PointXYZ, pcl::Normal> ism; // 创建隐式特征性状估计对象ism.setFeatureEstimator(feature_estimate); // 设置特征估计器ism.setTrainingClouds(training_clouds);ism.setTrainingNormals(training_normals);ism.setTrainingClasses(training_classes);ism.setSamplingSize(2.0f); // 设置采样大小pcl::ism::ImplicitShapeModelEstimation<153, pcl::PointXYZ, pcl::Normal>::ISMModelPtr model =pcl::features::ISMModel::Ptr(new pcl::features::ISMModel); // 创建ISM模型ism.trainISM(model); // 训练ISM模型//    std::string file("trained_ism_model.txt");
//    model->saveModelToFile(file); // 将训练好的ISM模型保存到文件中
//    model->loadModelFromfile(file); // 从文件中加载模型// 载入测试点云unsigned int testing_class = 0;pcl::PointCloud<pcl::PointXYZ>::Ptr testing_cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>("/home/jason/file/pcl-learning/13recognition识别/2隐式形状模型 ISM (Implicit Shape Model)/ism_test_cat.pcd",*testing_cloud) < 0){std::cout << "test cloud file read err!" << std::endl;return -2;}// 估计测试点云 的 法线pcl::PointCloud<pcl::Normal>::Ptr testing_normals(new pcl::PointCloud<pcl::Normal>);normal_estimator.setInputCloud(testing_cloud);normal_estimator.compute(*testing_normals);// 处理给定的测试数据,生存投票列表pcl::features::ISMVoteList<pcl::PointXYZ>::Ptr vote_list = ism.findObjects(model,testing_cloud,testing_normals,testing_class);// 根据模型参数计算半径和标准差double radius = model->sigmas_[testing_class] * 10.0;double sigma = model->sigmas_[testing_class];// 寻找最强的峰值点std::vector<pcl::ISMPeak, Eigen::aligned_allocator<pcl::ISMPeak>> strongest_peaks;vote_list->findStrongestPeaks(strongest_peaks, testing_class, radius, sigma);// 创建带颜色信息的点云对象pcl::PointCloud<pcl::PointXYZRGB>::Ptr colored_cloud(new pcl::PointCloud<pcl::PointXYZRGB>);colored_cloud->height = 0;colored_cloud->width = 1;pcl::PointXYZRGB point;point.r = 255;point.g = 255;point.b = 255;// 将测试点云的点添加到带颜色的点云对象中for (size_t i_point = 0; i_point < testing_cloud->points.size(); i_point++){point.x = testing_cloud->points[i_point].x;point.y = testing_cloud->points[i_point].y;point.z = testing_cloud->points[i_point].z;colored_cloud->points.push_back(point);}colored_cloud->height += testing_cloud->points.size(); // 更新点云的高度// 设置峰值点的颜色并将其添加到带颜色的点云对象中point.r = 255;point.g = 0;point.b = 0;for (size_t i_vote = 0; i_vote < strongest_peaks.size(); i_vote++){point.x = strongest_peaks[i_vote].x;point.y = strongest_peaks[i_vote].y;point.z = strongest_peaks[i_vote].z;colored_cloud->points.push_back(point);}colored_cloud->height += strongest_peaks.size();pcl::visualization::CloudViewer viewer("Result viewer");viewer.showCloud(colored_cloud);while (!viewer.wasStopped()) {}return 0;}

我的电脑配置不高,这个算法特别耗时,我在网上找了代码的输出结果:

绿色是要测试点云,灰色是colored_cloud,在猫中可以看到有一个红色质心。

 

怎么说,如果猫的姿态变换了,它能识别出来??

参考:

PCL_Implicit Shape Model_隐式形状模型 ISM_yamgyutou的博客-CSDN博客

这篇关于『点云识别』隐性模型ISM(Implicit Shape Model)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_45824067/article/details/131635905
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/640106

相关文章

Python中图片与PDF识别文本(OCR)的全面指南

《Python中图片与PDF识别文本(OCR)的全面指南》在数据爆炸时代,80%的企业数据以非结构化形式存在,其中PDF和图像是最主要的载体,本文将深入探索Python中OCR技术如何将这些数字纸张转... 目录一、OCR技术核心原理二、python图像识别四大工具库1. Pytesseract - 经典O

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

Pydantic中model_validator的实现

《Pydantic中model_validator的实现》本文主要介绍了Pydantic中model_validator的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录引言基础知识创建 Pydantic 模型使用 model_validator 装饰器高级用法mo

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应