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})

结果:

相关推荐
创世虚拟世界几秒前
把 3D 虚拟世界拉到本地:vibe coding 的手感,是从看见自己那一行改动开始的
javascript·数据库·人工智能·3d·gitee·虚拟现实
水如烟1 分钟前
孤能子视角:SEP《人工智能的认识论》EIS读法·证成——异质观察符校验:不是更严,是不同判据层
人工智能
梦想的初衷~4 分钟前
GPT × ArcGIS 强强联合:AI助力数据处理、空间分析、可视化及多案例综合应用实战教程
人工智能·gpt·arcgis
tq10865 分钟前
AI重塑软件生产活动
人工智能
硅谷秋水11 分钟前
Robo-COP 总结
人工智能·深度学习·机器学习·语言模型·机器人
工业视觉老A17 分钟前
攻克西林瓶液位人工灯检短板,AI 视觉检测保障灌装剂量稳定
人工智能·计算机视觉·视觉检测
lucas_AI19 分钟前
证不动的引理别再死拆了:Maestro 给 Lean 证明装上「总指挥」,研究级定理多证 63%
人工智能·llm
一个热爱拳击的玩家23 分钟前
本地实体如何构建面向 AI 检索的信任链?以杭州拳击行业案例分析
大数据·人工智能·信任链
u13013024 分钟前
GitHub 热榜项目:日榜(2026-10-20)
人工智能·github
GitCode官方26 分钟前
共筑昇腾算子开源生态|CANNBench Season1 沙龙收官,Season2 全新评测集发布
人工智能·ai·开源·cann·atomgit