当前位置: 首页 > news >正文

opencv kdtree pcl kdtree 效率对比

由于项目中以一个环节需要使用kdtree ,对性能要求比较严苛,所以看看那个kdtree效率高一些。对比了opencv和pcl。


#include <array>
#include <deque>
#include <fstream>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/flann.hpp>#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>#include <iostream>
#include <iostream>
#include <cstdlib>  // 用于 rand()
#include <ctime>    // 用于 time()int main() {// 初始化随机种子std::srand(std::time(0));// 生成 5000 个随机的二维点int numPoints = 5000;std::vector<cv::Point2f> points;pcl::PointCloud<pcl::PointXY>::Ptr cloud(new pcl::PointCloud<pcl::PointXY>);// 随机生成点,范围为 (-100, 100)for (int i = 0; i < numPoints; ++i) {float x = static_cast<float>(rand() % 200 - 100);  // x 坐标在 [-100, 100] 范围内float y = static_cast<float>(rand() % 200 - 100);  // y 坐标在 [-100, 100] 范围内points.push_back(cv::Point2f(x, y));cloud->points.push_back(pcl::PointXY(x, y));}// 2. 将点转换为 cv::Mat 格式cv::Mat pointMat(points.size(), 2, CV_32F);  // 每个点是 2D(x, y)for (size_t i = 0; i < points.size(); i++) {pointMat.at<float>(i, 0) = points[i].x; pointMat.at<float>(i, 1) = points[i].y;}// 3. 创建 KD-Tree 索引(使用 FLANN)cv::flann::Index kdtree(pointMat, cv::flann::KDTreeIndexParams(4)); // 4 表示树的分支数// 获取程序开始时的时钟时间std::clock_t start = std::clock();for(int i = 0 ;i < 200; ++i){std::vector<int> indices(1);     // 最近邻的索引std::vector<float> dists(1);     // 最近邻的距离float x = static_cast<float>(rand() % 200 - 100);  // x 坐标在 [-100, 100] 范围内float y = static_cast<float>(rand() % 200 - 100);  // y 坐标在 [-100, 100] 范围内cv::Mat query = (cv::Mat_<float>(1, 2) << x, y);kdtree.knnSearch(query, indices, dists, 1, cv::flann::SearchParams(32));// std::cout << "Query point: " << query << std::endl;// std::cout << "Closest point: " << pointMat.row(indices[0]) << std::endl;// std::cout << "Distance: " << dists[0] << std::endl;// std::cout << "----------------"  << std::endl;}std::clock_t end = std::clock();// 计算并输出经过的时间,单位是秒double duration = double(end - start) / CLOCKS_PER_SEC;std::cout << "opencv kdtree 搜索时间: " << duration << " 秒" << std::endl;/pcl::KdTreeFLANN<pcl::PointXY> pcl_kdtree;pcl_kdtree.setInputCloud(cloud);start = std::clock();for(int i = 0 ;i < 200; ++i){std::vector<int> indices(1);     // 最近邻的索引std::vector<float> dists(1);     // 最近邻的距离float x = static_cast<float>(rand() % 200 - 100);  // x 坐标在 [-100, 100] 范围内float y = static_cast<float>(rand() % 200 - 100);  // y 坐标在 [-100, 100] 范围内pcl::PointXY searchPoint;searchPoint.x = x;searchPoint.y = y;pcl_kdtree.nearestKSearch(searchPoint,1, indices, dists);// std::cout << "Query point: " << query << std::endl;// std::cout << "Closest point: " << pointMat.row(indices[0]) << std::endl;// std::cout << "Distance: " << dists[0] << std::endl;// std::cout << "----------------"  << std::endl;}end = std::clock();// 计算并输出经过的时间,单位是秒duration = double(end - start) / CLOCKS_PER_SEC;std::cout << "pcl kdtree 搜索时间: " << duration << " 秒" << std::endl;return 0;
}

CMakeLists.txt

# 设置 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)# 设置项目名称
project(test_kdtree)# 查找 OpenCV 包
find_package(OpenCV REQUIRED)
find_package(PCL REQUIRED)# 显示 OpenCV 的版本和路径
message(STATUS "OpenCV version: ${OpenCV_VERSION}")
message(STATUS "OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "OpenCV_LIBS: ${OpenCV_LIBS}")# 设置源文件
set(SOURCE_FILES test_kdtree.cpp)# 添加可执行文件
add_executable(${PROJECT_NAME} ${SOURCE_FILES})# 链接 OpenCV 库到目标程序
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS}  ${PCL_LIBRARIES})# 包含 OpenCV 的头文件路径
target_include_directories(${PROJECT_NAME} PRIVATE ${OpenCV_INCLUDE_DIRS})

结果:

相关文章:

opencv kdtree pcl kdtree 效率对比

由于项目中以一个环节需要使用kdtree ,对性能要求比较严苛&#xff0c;所以看看那个kdtree效率高一些。对比了opencv和pcl。 #include <array> #include <deque> #include <fstream> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp…...

1+X应急响应(网络)系统备份:

系统备份&#xff1a; 系统备份概述&#xff1a; 备份种类&#xff1a; 灾难恢复等级划分&#xff1a; 执行一次备份&#xff1a; 创建备份计划&#xff1a; 恢复备份&#xff1a;...

python os.path.dirname(path) 详解

dirname 是一个用于处理文件路径的 Python 函数&#xff0c;通常用于获取给定路径的目录部分。它是 os.path 模块中的一部分。下面是对 dirname 函数的详细解释和使用示例。 1、导入模块 首先&#xff0c;你需要导入 os 模块&#xff0c;因为 dirname 是 os.path 模块的一部分…...

深度解析 Feign

一、引言 在当今微服务架构盛行的时代&#xff0c;众多微服务相互协作构成了复杂的分布式系统。然而&#xff0c;各个微服务之间的调用往往涉及到诸多繁琐的细节&#xff0c;比如网络请求的构建、参数的处理、响应的解析等。为了让开发人员能够更加专注于业务逻辑的实现&#x…...

AI工业大模型报告:体系架构、关键技术与典型应用

研究意义 随着新一代人工智能的发展, 大模型&#xff08;如 GPT-4o 等&#xff09;凭借大规模训练数据、网络参数和算 力涌现出强大的生成能力、泛化能力和自然交互能力, 展现出改变工业世界的巨大潜力. 尽管大模型 已在自然语言等多个领域取得突破性进展, 但其在工业应用中的…...

深入理解接口测试:实用指南与最佳实践5.0(五)

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…...

常用List工具类(取交集、并集等等)

支持操作&#xff1a; 根据指定字段&#xff0c;获取两个对象集合的交集、补集、并集等将对象中的多个字段值&#xff0c;抽取到一个List中 import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function…...

4 C++ 复合类型:引用和指针

复合类型是指基于其它类型定义的类型。C 有几种复合类型&#xff0c;包括引用、指针。 1 引用 引用&#xff08;reference&#xff09;为对象起了另外一个名字&#xff0c;引用类型引用另外一种类型。通过将声明符写成&d的形式来定义引用类型&#xff0c;其中d是声明的变量…...

ABAP关于PS模块CJ20N中项目物料的屏幕和字段增强CI_RSADD

网上搜关于CJ20N的屏幕增强,基本都是关于项目定义(CI_PROJ)、项目WBS(CI_PRPS)、项目网络活动工序(CI_AFVU)的字段与屏幕增强,几乎没有关于项目物料(CI_RSADD)的字段屏幕增强,我在这里做一个分享。 主要逻辑:实现badi增强,并自建一个函数组后创建屏幕,在badi里面调用…...

探索IDE的无限可能:使用技巧与插件推荐

在软件开发的世界里&#xff0c;集成开发环境&#xff08;IDE&#xff09;是开发者的得力助手&#xff0c;它不仅提供了代码编辑、编译、调试等功能&#xff0c;还通过各种插件扩展了其功能&#xff0c;使得开发工作更加高效和便捷。本文将带你探索IDE的使用技巧和一些实用的插…...

自动化生成测试用例:利用OpenAI提升电商网站测试覆盖率

导语 自动化生成测试用例是软件测试领域一个强大的应用&#xff0c;通过OpenAI的语言模型&#xff0c;测试工程师可以快速生成高质量的测试用例&#xff0c;尤其是在处理边界条件和极端情况时&#xff0c;提升测试覆盖率。本篇文章将结合一个典型的电商网站案例&#xff0c;介绍…...

时间序列关于可解释性值得关注的论文汇总-第2篇

前言 这是时序可解释性论文汇总的第二篇&#xff0c;第一篇见这里&#xff08;后台回复&#xff1a;“论文合集”可直接获取整理的文章&#xff09;。深度学习的可解释性研究一直是热门&#xff0c;而时间序列的可解释性同样非常重要。这是因为时序模型被大量应用到特定领域&a…...

Vulnhub:DC-4靶机渗透——土豆片的靶机渗透练习

攻击机&#xff1a;kali 靶机&#xff1a;DC-4 一&#xff0c;信息收集 1.主机发现 找寻同网段下存活的主机 arp-scan -l2.端口扫描 查看此主机上有哪些开放端口 nmap -sV -p- 192.168.126.136发现22&#xff0c;80端口&#xff0c;远程连接跟网站&#xff08;大概&…...

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…...

Java集合(Collection+Map)

Java集合&#xff08;CollectionMap&#xff09; 为什么要使用集合&#xff1f;泛型 <>集合框架单列集合CollectionCollection遍历方式List&#xff1a;有序、可重复、有索引ArrayListLinkedListVector&#xff08;已经淘汰&#xff0c;不会再用&#xff09; Set&#xf…...

微信小程序02-页面制作

微信小程序页面制作指南 目录 微信小程序页面制作 1. 个人信息展示小程序 案例分析 需求背景&#xff1a;许多大学生毕业后需要求职&#xff0c;因此制作一个展示个人信息的微信小程序对招聘人员快速了解求职者非常有帮助。页面布局&#xff1a;页面分为头像区域和详细信息…...

zabbix监控端界面时间与服务器时间不对应

1. 修改系统时间 # tzselect Please select a continent, ocean, "coord", or "TZ".1) Africa2) Americas3) Antarctica4) Asia5) Atlantic Ocean6) Australia7) Europe8) Indian Ocean9) Pacific Ocean 10) coord - I want to use geographical coordina…...

端对端加密是如何通过SDK防御实现的?

端对端加密&#xff08;End-to-End Encryption&#xff0c;E2EE&#xff09;是一种确保数据在传输过程中不被第三方截获和篡改的技术。随着网络安全威胁的日益增多&#xff0c;端对端加密在即时通讯、文件传输等领域变得越来越重要。本文将详细介绍如何通过SDK&#xff08;Soft…...

Flutter:input输入框

输入框&#xff1a; // 是否显示关闭按钮 bool _showClear false; // 文字编辑控制器&#xff0c;监听搜索框的变化。 final TextEditingController _controller TextEditingController(); // 输入框发生变化事件 void _onChange(String value){if(value.length > 0){setS…...

RabbitMQ 与 PHP Swoole 实现

RabbitMQ 与 PHP Swoole 的结合实现 一、概述 RabbitMQ 是一个开源的消息队列中间件&#xff0c;允许通过异步消息传递来解耦应用程序的各个部分。Swoole 是一个高性能的 PHP 扩展&#xff0c;支持异步编程和协程&#xff0c;适用于构建高并发的网络服务。将 RabbitMQ 与 Swo…...

【计算机体系架构】 MESI缓冲一致性

高并发学习参考 https://blog.csdn.net/MrYushiwen/article/details/123049838 https://cloud.tencent.com/developer/article/2197857 ESI 是指Cache 行的三种一致性状态&#xff1a;E&#xff08;Exclusive&#xff0c;独占&#xff09;&#xff0c;S&#xff08;Shared&…...

STM32设计学生宿舍监测控制系统

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 随着科技的飞速发展和智能化时代的到来&#xff0c;学生宿舍的安全、舒适…...

企业生产环境-麒麟V10(ARM架构)操作系统部署kafka高可用集群

前言&#xff1a;Apache Kafka是一个分布式流处理平台&#xff0c;由LinkedIn开发并捐赠给Apache软件基金会。它主要用于构建实时数据流管道和流应用。Kafka具有高吞吐量、可扩展性和容错性的特点&#xff0c;适用于处理大量数据。 以下是Kafka的一些核心概念和特性&#xff1…...

awk(常用)

这个有点难 O.o 一、awk # 语法 awk 参数 模式 {动作} 文件# 第一列&#xff0c;包含p的 $1~"p" # 第一列&#xff0c;不包含p的 $1!~"p" # 开始时干嘛&#xff0c;结束时干嘛 awk BEGIN{开始时做的事}END{结束时做的事}{print $0} 文件 1、内置变量&…...

Amazon Web Services (AWS)

一、Amazon Web Services (AWS)介绍 1、简介 2、产品 AWS 提供了各种云计算服务&#xff0c;包括 DynamoDB、S3、EC2、Lambda 等等。 登录aws后点击所有服务也可以看到amazon的所有服务&#xff1a; 3、免费试用产品 除了免费的Amazon Step Functions、Amazon Lambda&#…...

Java EE 技术基础知识体系梳理

1. Java EE 平台概述 1.1 发展历程 Java EE 从 J2EE 发展而来&#xff0c;经历了多个版本的演进&#xff0c;从早期的 J2EE 1.2 到最新的 Jakarta EE。 1.2 架构特点 多层架构&#xff1a; 客户端层&#xff1a;用户界面&#xff0c;如 Web 浏览器、移动应用等。Web 层&…...

【2025最新计算机毕业设计】基于SpringBoot+Vue电脑在线装机指南教程网站【源码+文档】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

HDFS新增节点和删除datanode节点

在实际的hadoop环境中&#xff0c;有时我们需要新增或者删除datanode节点&#xff0c;来达到扩容或缩容的目的&#xff0c;本文就来讲解如何新增和删除datanode。 新增节点和删除节点会涉及两个关键的配置项&#xff08;hdfs-site.xml文件中&#xff09;&#xff1a; dfs.hos…...

数据结构-线性表-具有独立头节点的双向循环链表

完整代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6013)#include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<time.h>// 一个具有独立头节点的双向循环链表&#xff0c; // 区别在于将头节点和数据区域…...

CSS 响应式设计之媒体查询技术

CSS 媒体查询&#xff08;Media Queries&#xff09;是一种根据不同设备的特性&#xff08;如屏幕宽度、分辨率、方向等&#xff09;来应用不同的 CSS 样式的技术。它通常用于响应式设计&#xff0c;帮助网页在不同设备和屏幕尺寸下良好地展示。 基本语法 media (条件) {/* 样…...