OpenCV (c++)使用KDTree时,得到正确结果后报Segmentation fault (core dumped)
一、给出问题
构建包含以下文件的工程(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)相关推荐
- 人工机器:jetsonnano推理时出现 Segmentation fault(core dumped)
前期配置:tensorrt+tensorflow+object_detection编译安装填坑教程!! 1.在使用此工程:https://github.com/dusty-nv/jetson-infe ...
- c++ 自定义比较函数,运行时发生segmentation fault
c++ map自定义比较函数,发生运行时越界. #include <string> #include <iostream> #include <list> #inc ...
- 偶然出现 segmentation fault 时的调试方法与 SIGSEGV 信号
问题描述 最近遇到一个 bug,有一定的偶然性会出现段错误.第一步需要确定的是段错误出现在哪里.可由于这个 bug 的偶然性,常规的方法无法确定问题. 根据经验,这个问题有两个方案可以使用. 生成 c ...
- opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突
opencv 读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突 release模式解决方法:release 模式下要用opencv_world440d.lib,删除opencv_worl ...
- 删除双系统linux分区,双系统时如何正确删除Linux系统
双系统时如何正确删除Linux系统 (2012-07-23 21:37:24) 标签: 杂谈 一直用的是win7和Ubuntu的双系统,上次在win7系统下重新区分了硬盘大小,结果开机时两个系统都不能 ...
- Visual Studio 2017在编译OpenCV 4.2.0时出现编译器错误C2001:常量中有换行符
Visual Studio 2017在编译OpenCV 4.2.0时出现编译器错误C2001:常量中有换行符 问题描述: Visual Studio 2017在编译OpenCV 4.2.0时出现编译器 ...
- 拍照时的正确姿势你掌握了吗?(下)
之前我跟大家分享了拍照时的正确姿势,因为有些事情没有完全分享完,这几天又耽误了,真不好意思.那么今天是周日,正好有时候我就把拍照的正确姿势剩下的内容给大家分享出来,希望大家结合之前的文章,好好的掌握这 ...
- Opencv使用imread函数时,读到的数据为空
问题描述:使用opencv的imread函数时,读到的数据为空. 程序: Mat img;string namepic="street.png";img = imread(name ...
- Python使用opencv打开笔记本摄像头时遇到的问题及解决办法
Python使用opencv打开笔记本摄像头时遇到的问题及解决办法 最近在学习python,想用opencv做个人脸检测,打开笔记本摄像头时遇到了问题.摄像头总是闪一下就关闭,并提示一行警告([ WA ...
最新文章
- MPB:宁大张德民组-对虾养殖系统微生物组样品的采集与制备
- 一句话后门中eval和assert的区别
- pytorch tensor 筛选排除
- 用c语言读取固定大小的raw格式图像并统计灰度值
- 哪款浏览器速度最快_全球知名度非常高的火狐浏览器,它好在哪呢?
- 【CCCC】L3-007 天梯地图 (30分),两次Dijkstra+路径打印(数据点2,4错因),90行最短题解
- go语言渐入佳境[10]-function
- 新建UE4 c++类
- PostgreSQL数据库常用SQL语句
- 【Redis高手修炼之路】客户端工具——客户端工具以及常用命令
- 依赖注入框架 ----Dagger2 使用详解及源码分析
- 做了三年前端开发后,我选择回家创业
- 射频识别技术在手机支付技术中的应用
- node 暴漏模块中的api(转自了不起的node)
- android 开发sdk 找不到java类_开发Cordova插件(Android)时找不到源Java类
- 数字的原码,补码,反码,~和‘-’的区别。取反与负号的区别。
- 云计算运维工程师是做什么的?需要经常加班吗?
- C 语言项目中.h文件和.c文件的关系
- C# WPF窗体+WCF实现五子棋
- CMU 15-445 数据库课程第五课文字版 - 缓冲池