一、给出问题

构建包含以下文件的工程(opencv_test)

各文件内容给出如下:

# CMakeLists.txt
cmake_minimum_required(VERSION 2.18)
project(opencv_test)find_package(OpenCV REQUIRED)include_directories(${OpenCV_INCLUDE_DIRS})add_executable(${PROJECT_NAME} main.cppkdtree.cpp kdtree.h)
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
// kdtree.cpp
#include "kdtree.h"
KDTree::KDTree(std::vector<Point> ref_points)
{ref_points_ = ref_points;ConstructKDTree(kdtree_);
}void KDTree::ConstructKDTree(cv::flann::Index* kdtree) // C1
{std::vector<cv::Point2f> features = { { 1,1 },{ 2, 2},{ 3, 3},{ 4, 4},{ 2, 4} };cv::Mat source = cv::Mat(features).reshape(1);source.convertTo(source, CV_32F);cv::flann::KDTreeIndexParams indexParams(2);kdtree = new cv::flann::Index(source, indexParams); // C2
}void KDTree::GetIndex()
{//预设knnSearch所需参数及容器int queryNum = 3;//用于设置返回邻近点的个数std::vector<float> vecQuery(2);//存放查询点的容器std::vector<int> vecIndex(queryNum);//存放返回的点索引std::vector<float> vecDist(queryNum);//存放距离cv::flann::SearchParams params(32);//设置knnSearch搜索参数//KD树knn查询vecQuery = { 3, 4};printf("ok31\n");kdtree_->knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3printf("ok32\n");std::cout << "vecDist: " << std::endl;for (auto&x : vecDist)std::cout << x << " ";std::cout << std::endl;std::cout << "vecIndex: " << std::endl;for (auto&x : vecIndex)std::cout << x << " ";std::cout<<std::endl;
}
// kdtree.h
#ifndef KDTREE_H
#define KDTREE_H
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include <memory>struct Point{double x;double y;double z;
};class KDTree{public:KDTree(std::vector<Point> ref_points);void ConstructKDTree(cv::flann::Index* kdtree);  // C4void GetIndex();private:// cv::Mat source;std::vector<Point> ref_points_;cv::flann::Index* kdtree_;  // C5
};#endif // KDTREE_H
// main.cpp
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
#include "kdtree.h"int main() {//用于构造kdtree的点集std::vector<Point> points;KDTree kdtree = KDTree(points);kdtree.GetIndex();return 0;
}

构建好后

cd ~/opencv_test/build
cmake ..
make
./opencv_test

报错:
ok31
Segmentation fault (core dumped)

根据标记可知,运行到kdtree->knnSearch(...)这里出错的。

根据opencv kdtree的用法后半部分描述的:

所以,感觉和指针释放有关。于是做了几组实验,分别记录成功不不成功的情况。

二、不同组合的实验与结果

实验通过:对上面代码中注释有C1-C5的各行进行不同设置。

2.1 指针引用cv::flann::Index*& kdtree作为函数输入(成功)

void KDTree::ConstructKDTree(cv::flann::Index*& kdtree) // C1  变化
kdtree = new cv::flann::Index(source, indexParams); // C2
kdtree_->knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3
void ConstructKDTree(cv::flann::Index*& kdtree);  // C4  变化
cv::flann::Index* kdtree_;  // C5

2.2 继2.1后,采用内置函数build构建kdtree(失败)

void KDTree::ConstructKDTree(cv::flann::Index*& kdtree) // C1  变化
kdtree->build(source, indexParams);  // C2  变化
kdtree_->knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3
void ConstructKDTree(cv::flann::Index*& kdtree);  // C4  变化
cv::flann::Index* kdtree_;  // C5

内置函数build也可以构建kdtree

发现,直接在kdtree->build(...)处报错。

2.3 采用变量引用cv::flann::Index& kdtree(成功)

void KDTree::ConstructKDTree(cv::flann::Index& kdtree) // C1  变化
kdtree.build(source, indexParams);  // C2  变化
kdtree_.knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3
void ConstructKDTree(cv::flann::Index& kdtree);  // C4  变化
cv::flann::Index kdtree_;  // C5

2.4 在2.3基础上采用类构造函数实例化kdtree(失败)

void KDTree::ConstructKDTree(cv::flann::Index& kdtree) // C1  变化
kdtree = cv::flann::Index(source, indexParams);  // C2  变化
kdtree_.knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3
void ConstructKDTree(cv::flann::Index& kdtree);  // C4  变化
cv::flann::Index kdtree_;  // C5


根据标记可知,运行到kdtree.knnSearch(...)这里出错的。

2.5 在2.4基础上,成员函数不用引用输入

void KDTree::ConstructKDTree(cv::flann::Index kdtree) // C1  变化
kdtree = cv::flann::Index(source, indexParams);  // C2  变化
kdtree_.knnSearch(vecQuery, vecIndex, vecDist, queryNum, params); // C3
void ConstructKDTree(cv::flann::Index kdtree);  // C4  变化
cv::flann::Index kdtree_;  // C5


根据标记可知,初始化kdtree时就出错。

结论

  • 内部成员函数传入kdtree变量,无论是否是指针,都要以引用的方式传入;
  • 如果是指针变量,以kdtree = new cv::flann::Index(source, indexParams);构建kdtree;
  • 如果是一般变量,则以kdtree.build(source, indexParams);构建kdtree.

OpenCV (c++)使用KDTree时,得到正确结果后报Segmentation fault (core dumped)相关推荐

  1. 人工机器:jetsonnano推理时出现 Segmentation fault(core dumped)

    前期配置:tensorrt+tensorflow+object_detection编译安装填坑教程!! 1.在使用此工程:https://github.com/dusty-nv/jetson-infe ...

  2. c++ 自定义比较函数,运行时发生segmentation fault

    c++ map自定义比较函数,发生运行时越界. #include <string> #include <iostream> #include <list> #inc ...

  3. 偶然出现 segmentation fault 时的调试方法与 SIGSEGV 信号

    问题描述 最近遇到一个 bug,有一定的偶然性会出现段错误.第一步需要确定的是段错误出现在哪里.可由于这个 bug 的偶然性,常规的方法无法确定问题. 根据经验,这个问题有两个方案可以使用. 生成 c ...

  4. opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突

    opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突 release模式解决方法:release 模式下要用opencv_world440d.lib,删除opencv_worl ...

  5. 删除双系统linux分区,双系统时如何正确删除Linux系统

    双系统时如何正确删除Linux系统 (2012-07-23 21:37:24) 标签: 杂谈 一直用的是win7和Ubuntu的双系统,上次在win7系统下重新区分了硬盘大小,结果开机时两个系统都不能 ...

  6. Visual Studio 2017在编译OpenCV 4.2.0时出现编译器错误C2001:常量中有换行符

    Visual Studio 2017在编译OpenCV 4.2.0时出现编译器错误C2001:常量中有换行符 问题描述: Visual Studio 2017在编译OpenCV 4.2.0时出现编译器 ...

  7. 拍照时的正确姿势你掌握了吗?(下)

    之前我跟大家分享了拍照时的正确姿势,因为有些事情没有完全分享完,这几天又耽误了,真不好意思.那么今天是周日,正好有时候我就把拍照的正确姿势剩下的内容给大家分享出来,希望大家结合之前的文章,好好的掌握这 ...

  8. Opencv使用imread函数时,读到的数据为空

    问题描述:使用opencv的imread函数时,读到的数据为空. 程序: Mat img;string namepic="street.png";img = imread(name ...

  9. Python使用opencv打开笔记本摄像头时遇到的问题及解决办法

    Python使用opencv打开笔记本摄像头时遇到的问题及解决办法 最近在学习python,想用opencv做个人脸检测,打开笔记本摄像头时遇到了问题.摄像头总是闪一下就关闭,并提示一行警告([ WA ...

最新文章

  1. MPB:宁大张德民组-对虾养殖系统微生物组样品的采集与制备
  2. 一句话后门中eval和assert的区别
  3. pytorch tensor 筛选排除
  4. 用c语言读取固定大小的raw格式图像并统计灰度值
  5. 哪款浏览器速度最快_全球知名度非常高的火狐浏览器,它好在哪呢?
  6. 【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
  7. go语言渐入佳境[10]-function
  8. 新建UE4 c++类
  9. PostgreSQL数据库常用SQL语句
  10. 【Redis高手修炼之路】客户端工具——客户端工具以及常用命令
  11. 依赖注入框架 ----Dagger2 使用详解及源码分析
  12. 做了三年前端开发后,我选择回家创业
  13. 射频识别技术在手机支付技术中的应用
  14. node 暴漏模块中的api(转自了不起的node)
  15. android 开发sdk 找不到java类_开发Cordova插件(Android)时找不到源Java类
  16. 数字的原码,补码,反码,~和‘-’的区别。取反与负号的区别。
  17. 云计算运维工程师是做什么的?需要经常加班吗?
  18. C 语言项目中.h文件和.c文件的关系
  19. C# WPF窗体+WCF实现五子棋
  20. CMU 15-445 数据库课程第五课文字版 - 缓冲池

热门文章

  1. 只用html如何实现音乐播放,如何使用html实现音乐播放
  2. Linux软件开发工程师
  3. 动漫人脸识别技术及数据集介绍
  4. windows redis 假死处理
  5. 上研动力小课堂丨柴油机启动困难原因大揭秘(上篇)
  6. 求职招聘平台(脉脉、BOSS、拉钩、猎聘)之功能体验
  7. 高德地图正确食用方法(持续更新)
  8. HashMap、ConcurrentHashMap原理分析
  9. 联想惠普谁才是pc的最后王者
  10. 双硬盘笔记本电脑安装WIN10和Ubuntu双系统(二)