自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 资源 (1)
  • 收藏
  • 关注

原创 vs2019+cmake编译colmap

colmap源码在这里colmap@github下载,用git把源码克隆到本地。用cmake打开colmap目录,新建build文件夹用来保存编译后的工程。需要用到的库有boost,eigen3,ceres,metis,glog等等,需要的库太多所以用vcpkg管理,在cmake的configure的时候遇到找不到的库,就用vcpkg下载,以boost为例,在powershell窗口中输入命令.\vcpkg install boost:64-windows。然后在cmake界面添加该库的include

2022-03-02 15:35:54 1443

原创 opencv环境下图像双线性插值重采样

bool RescaleImage(cv::Mat& image, unsigned int cols_new, unsigned int rows_new){ if (cols_new * rows_new == 0 || image.data == nullptr) return 0; cv::Mat image_copy; image_copy.create(image.rows, image.cols, CV_8UC3); image_copy = image.clone();

2022-02-21 11:16:17 2067 1

原创 力扣练习661-

661. 图片平滑器vector<vector<int>> imageSmoother(vector<vector<int>>& img){ vector<vector<int>> ans(img.size(), vector<int>(img[0].size())); for (int i = 0; i < img.size(); ++i) { for (int j = 0; j < i

2021-10-21 15:36:35 174

原创 C++获取文件夹下所有子文件名

根据给定的文件夹路径string strFilePath,遍历获取文件夹目录下所有子文件的文件名到vector<string> FilesName。代码:方法:void getFiles(string path, vector<string>& files){ //文件句柄 intptr_t hFile = 0; //文件信息 struct _finddata_t fileinfo; string p; if ((hFile = _findfirst(p.a

2021-10-13 14:30:55 801 1

原创 三维重建深度图canny算子提取

使用a13d对一组影像做稠密重建,在计算影像深度图->深度图融合的过程中添加步骤,使用canny算子对深度图进行处理,提取边缘特征。保存深度图的类:在这里插入代码片

2021-10-09 17:31:47 377

原创 计算FPFH快速点特征直方图

参考PCL源码实现计算点云的FPFH,方便理解和后续使用。调用PCL的FPFH方式: //PCL计算点云FPFH pcl::FPFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> fpfh; fpfh.setInputCloud(FeatureCloud); fpfh.setInputNormals(FeatureNormals); pcl::PointCloud<pcl::FPFHSignature33

2020-12-01 09:36:37 1237 4

原创 PCL计算PFH源码computePairFeatures

在用pcl库计算PFH点特征直方图时,求解点对的四元组需要用到这个函数:computePairFeatures (const Eigen::Vector4f &p1, const Eigen::Vector4f &n1, const Eigen::Vector4f &p2, const Eigen::Vector4f &n2, float &f1, float &f2, fl

2020-11-26 18:00:51 634 9

原创 计算PFH点特征直方图

用PFH(点特征直方图)描述子对点云中提取出来的特征点进行定量描述。可以使用PCL库实现,具体代码: pcl::PFHEstimation<pcl::PointXYZ, pcl::Normal, pcl::PFHSignature125> pfh; pfh.setInputCloud(FeatureCloud); pfh.setInputNormals(FeatureNormals); pcl::PointCloud<pcl::PFHSignature125>::Ptr p

2020-11-26 13:52:05 395 2

原创 基于法向量的点云特征提取

环境依赖:pcl1.9.1。参考:熊风光.三维点云配准技术研究[D].中北大学,2018。算法思想:目前做到了特征值分解和法向量提取这一块,对点云内的单个点计算法向量。后续边做边更新。实现:// FeaturePointExtraction.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <iostream>#includ

2020-11-16 17:38:16 3338 8

原创 RANSAC法点云粗匹配

环境依赖:pcl 1.9。实现目标:已有两组对同一目标在不同位置下扫描的点云数据,计算得到两组点云的刚体变换旋转矩阵和位移向量。基本思路:在待匹配的源点云中随机选取三个点s1,s2,s3作为采样点;在目标点云中随机选取一个点t1,作为s1的对应点;在目标点云中搜索并获取一个点t2,搜索条件为t1到t2的距离等同于s1到s2的距离,把t2点作为s2的对应点;在目标点云中搜索并获取一个点t3,搜索条件为t3到t2、t3到t1的距离等同于s3到s2、s3到s1的距离,把t3点作为s3的对应点。;根据

2020-11-10 14:50:44 3565 1

原创 豆瓣爬虫使用

python小白,爬虫小白,现需要做一个大量数据可视化的工作,选择github上的一个爬取豆瓣电影评论的项目,记录下使用全过程。首先在豆瓣爬虫这里下载源码。核心文件有三个:fetch.py爬取保存数据,visual.py数据清洗和可视化,stopwords.txt分词库。环境配置。先配置python环境,官网最新版python3.9.0不支持win7操作系统,下载python3.7并安装,按照安装向导一路next,注意要勾选pip工具。随后安装脚本会用到的工具库,命令行运行pip install re

2020-11-04 10:01:25 893 1

原创 CGAL5.1编译记录

PCL提供的ICP算法使用效果不太满意,尝试使用CGAL的super 4PCS配准方法。先配置环境编译CGAL,把过程记录下来,主要参考了这一篇。环境是win7+vs2017。一、准备:从官网下载CGAL源码,地址https://www.cgal.org/。这里下载最新版5.1.下载Eigen并解压,地址:Eigen官网。这里下载最新版3.3.8。还有一些其他的依赖,之前已经安装过了,有CMake,Zlib1.2.11,Boost1.73.0。二、添加环境变量:添加BOOST_INCLUD

2020-10-19 15:39:24 777

原创 icp配准进度条

icp配准过程太慢了,考虑加个进度条。先在主对话框上测试一下进度条的用法,需要用多线程来执行。新建一个类MyThread,头文件:#pragma once#include <process.h>#include <Windows.h>#define WM_USER_MSG WM_USER + 1001class MyThread{ public: // 线程回调函数必须是全局函数 static void Run(void *ptr); public:

2020-10-13 17:33:57 328

原创 用Eigen::umeyama计算两组向量的旋转变换

之前使用pcl库提供的icp算法对点云进行校准,但是校准结果质量很不理想,因为用于计算迭代方程的同名点对选取的效果很不好,于是决定人工选取同名点对,再求解旋转矩阵R和平移矩阵T,得到校准后的点云。人工选取同名点对通过为osg视图添加两个EventHandler实现,分别是PickHandler和CvlMeasureHandler。PickHandler的作用是根据鼠标在屏幕上的位置获取(pick)视图内相对应的点的坐标,CvlMeasureHandler的作用是高亮显示被选中的点。人工选取若干组点对后,

2020-09-25 17:27:51 3925

原创 ICP配准同名点对输出

使用PCL库的icp算法对两组点云数据进行配准,并输出两组点云的同名点对信息,由于icp算法流程里,source点云向target点云匹配的过程中,每一次迭代都会为source点云内的每个点在target点云内寻找最近点,因此每次迭代过程都会生成一组同名点对。输出每一次迭代过程中的点对信息,就可以找到原始两组点云内的同名点对。具体操作:修改icp.hpp文件,文件路径:%PCL安装路径%\include\pcl-1.9\pcl\registration\impl\icp.hpp。在函数pcl::Itera

2020-09-09 14:52:36 948 1

原创 pcl库的icp算法使用

现在需要对一组连续点云数据进行配准,之前尝试过使用libicp库,但是这个库太久不更新了,听人建议改为使用pcl库提供的icp方法。一、配置pcl环境安装。在pcl的官方github页面下载对应自己vs版本和操作系统位数的pcl安装包,我使用的是vs2017,所以下载了PCL-1.9.1-AllInOne-msvc2017-win64.exe和pcl-1.9.1-pdb-msvc2017-win64.zip两个文件,安装exe文件,过程中会提示是否要安装三方库boost,eigen,flann,ope

2020-09-08 15:03:02 888

原创 pcd文件读写

主要参考官网源码#include "stdafx.h"#include <pcl/visualization/cloud_viewer.h>#include <iostream>#include <pcl/io/io.h>#include <pcl/io/pcd_io.h>#include <pcl/io/ply_io.h>#include <pcl/point_types.h> #include <pcl/reg

2020-09-08 13:47:43 437

原创 两种ICP算法的计算结果比较

分别使用pcl::icp和libicp两种icp算法处理相同的一对点云数据,target数据由source数据作缸体转换得来,转换关系: fprintf(pOutFile, "%d", int(point.x*1 + point.y*0 + point.z*0 + 100)); fputc(',', pOutFile); fprintf(pOutFile, "%d", int(point.x*0 + point.y*0.707 + point.z*0.707 + 200)); fpu

2020-09-04 17:32:00 863

转载 《点云数据配准及曲面细分技术》摘录

匹配方法ICP算法,布尔莎模型,筛选有效数据点的算法ransac。

2020-08-27 16:28:31 255

原创 创建MFC线程

《MFC WINDOWS程序设计》17.1 线程对于Windows来说,所有线程都是一样的。但是MFC却把线程区分为两种类型:User Interface(UI) threads和Worker threads,用户界面线程和工作者线程。两类线程的不同之处在于UI线程具有消息循环而工作者线程没有。UI线程可以创建窗口并处理发送给这些窗口的消息。工作者线程执行后台任务,因其不接收用户的直接输入,所以不需要窗口和消息循环。系统本身就提供了两个非常好的例子,可以说明UI线程和工作者线程的用途。当在操作系统的命

2020-08-21 14:42:02 277

原创 MFC线程中断和重启

给程序写了一个显示实时数据的功能,用的是mfc线程的方式AfxBeginThread。这个功能的入口一共有三个,分别是第一次点击按钮进入该功能,第多次点击按钮进入该功能,和点击保存当前数据按钮并完成采样之后自动进入该功能。由于在保存当前数据的过程中,需要中断实时数据显示的操作,就涉及到线程的中断和重启:DWord CWinThread::ResumeThread();//重启线程DWord CWinThread::SuspendThread();//中断(挂起)线程为了让三种进入该功能的途径都能正常

2020-08-17 16:10:10 963

原创 mutex互斥锁和MFC线程使用

在把点云数据写入本地时用到了多线程方法,对于每一秒内的20个frame,分别启用一个线程进行数据写入,这样做会导致点云数据条目有个别错误,表示一个点的信息的一行数据应当包含且仅包含xyz,反射率和时间戳,但是实际生成的文件里总会有个别几条信息出现数据条目个数不对,或者数值明显错误的现象。之前采取的解决办法是,在写入文件和读文件之前用一个判断来进行过滤,但是治标不治本。今天发现livox sdk里使用的mutex互斥锁可以用在这里,在以点为单位进行循环写文件的过程中,在写入每一个点的信息之前加上一句std::

2020-08-13 15:11:20 1048

原创 清空临时文件夹

在进行点云预览的过程中会产生txt格式的临时文件,为避免累计过多临时文件,在每次开始预览时清空预览文件的缓存文件夹。方法://清空临时文件夹void ClearTempFolder(){ char *chDoc = "."; char *strFileNameTemp = new char[100]; WIN32_FIND_DATA FileData;//WIN32_FIND_DATA数据结构对象 HANDLE hSearch; BOOL bFinished = FALSE; string

2020-08-12 17:29:11 131

原创 osg视图刷新和MFC类外获取控件句柄

用MFC_OSG.cpp里的cOSG类做视图显示,删除视图可以用delete osg对象的方法。现在需要不使用面向对象的方法而是用面向过程的方法做点云刷新,因为对象的构造和析构过程会比较耗时。参考cOSG类对析构函数的定义,在用osg做显示的函数后面加上相应的操作,并起不到作用。经过尝试后发现可以禁止viewerbase::frame的自动渲染,cOSG类内对渲染过程的定义是:while(!viewer.done()){ viewer->frame(); Sleep(10);}只要终止

2020-08-12 11:24:40 421

原创 修改osg相机初始参数

参考https://blog.csdn.net/u012501459/article/details/36666305因为要用camera显示点云的正视图,但是默认相机参数会导致默认视图是右视图。参考https://blog.csdn.net/u012501459/article/details/36666305修改相机参数,让初始视图改为正视图。使用MFC_OSG类实现osg显示,在InitCameraConfig函数内添加如下代码://设置相机参数 osg::Vec3d eye, center,

2020-08-07 16:34:21 947

原创 解决MFC使用osg内存泄漏问题

在MFC程序中调用osg库显示数据,debug模式下程序运行结束后会出现大量的内存泄漏:Detected memory leaks!Dumping objects ->{64344} normal block at 0x00000000052882D0, 8 bytes long. Data: <0 ) > 30 07 29 05 00 00 00 00 {64343} normal block at 0x0000000005288320, 16 bytes long.

2020-08-06 15:28:32 490

原创 MFC程序兼容性测试

把MFC生成的可执行文件放到虚拟机裸机上面,测试兼容性。在win7系统上面能够很好地运行,但是在win10系统上面的点云无法正确显示。研究发现是软件写入本地的txt文件质量太差了,有很多错误数据,导致有一些坐标十分离谱的点也被显示到画幅里,显示的时候真实模型只被压缩在了很小的空间内。问题应该是出在多线程写本地txt文件的过程中,后续可能不写lvx,只写txt或者las,不知道是否能解决这个问题。目前采用的办法是在用osg显示点云之前,把点云数据的正确性评估标准提高,之前仅仅判断了是否有数据缺失,没有判断

2020-07-31 17:30:40 411

原创 OSG点云上色

用osg显示点云,目前显示的所有点都是同一个颜色的,想优化一下视觉效果,由于每一个点都具有一个反射率参数,所以可以用这个参数为点上色。还尝试过添加光照渲染,参考:https://zhuanlan.zhihu.com/p/38469643。光照渲染适合三维模型,用在点云上好像没什么意义。点的颜色是通过geometry的setColorArry方法实现的,用四维向量Vec4填充进数组,和点的坐标数组一一对应。ref_ptr<osg::Vec4Array> color = new Vec4Arr

2020-07-30 15:35:32 1032

原创 Livox MFC程序发布

在之前的文章:https://blog.csdn.net/m0_49291417/article/details/107486999 里尝试从底层新建一个livox的工程,新建项目后把lidar_lvx_sample项目里的源码搬过来就可以正常获取雷达数据了。用这种方法创建了一个mfc窗体应用程序。但是在用release配置运行的时候却运行失败了,因为无法识别lidar_lvx-sample里用到的一些方法函数,而这些方法函数的实现其实是写在其他项目里的。源sdk里的sdk_core这个项目包含了程序运行所

2020-07-30 13:37:09 442

原创 用编译好的liblas库配置vs2017工程

拿到了已经编译好的liblas库和boost库,共有如下几个文件夹:boost,laszip,lib,liblas,共同放在las根目录下。我把laszip和liblas里的绝大部分头文件放在了新建的同级include文件夹下,该文件夹和las文件夹共同作为工程的包含文件夹。把las也放进包含目录是因为这些头文件里的包含通常是从las文件夹下开始搜寻的。las/lib作为工程的库文件目录,但是由于编译器版本的原因,别人编译好的库我并不能直接用。于是需要自己重新编译boost,并把这些lib文件替换为对

2020-07-28 14:58:15 770

原创 输出时间戳

把livox雷达获取的点云数据的时间戳信息也写入本地txt文件。点云数据包point_packet_list里是用uint_8 [8]数组格式保存的,每一个point_packet内的100个点共享一个时间戳。源数据里的时间戳示例:78361908590,78362909250,78363908720。在程序内显示一个frame内的50个point_packet内的共50个时间戳数据细节示例:找到由后者转换为前者的方法。上图所示的数据结构内的每一行的8个十进制数字代表一个时间戳,如7836190859

2020-07-27 11:37:44 715 1

原创 MFC控件内OSG点云刷新

利用MFC的edit control作为osg点云的显示界面,需求是点击按钮实现在同一个控件内显示不同点云信息。但是叠加显示会让图像闪烁,而且无法对后添加的点云图层进行缩放移动等处理。改进办法的原理是在每次显示点云之前把当前的viewer对象delete掉。在MFC_OSG.h的cOSG类里添加两个方法函数:void cOSG::RemoveImg(void){ mRoot->removeChildren(0, 1);}void cOSG::ClearView(void){ dele

2020-07-24 15:25:47 308

原创 学习日志2020.7.23 MFC显示OSG点云

在mfc上显示osg文件:https://blog.csdn.net/weixin_30526593/article/details/97294251将获取的点云模型写入osg文件:bool result = osgDB::writeNodeFile(*root.get(), "my.osg");if (!result)osg::notify(osg::FATAL) << "Failed in osgDB::writeNodeFile()" << std::endl;但

2020-07-23 11:37:42 298

原创 学习日志2020.7.21 重写sdk

把livox的sdk自己重新创建一遍,记录下过程。新建工程。一、配置osg:debug配置下添加两个osg的包含目录:e:\osg\build\includee:\osg\OSG-3.6.3\include添加一个库目录:e:\osg\build\libdebug配置下,链接器-输入,添加附加依赖项:OpenThreadsd.libosgd.libosgDBd.libosgUtild.libosgGAd.libosgViewerd.libosgTextd.librelease

2020-07-21 14:06:45 750

原创 学习日志2020.7.20 点云保存并显示

写了一个函数,在探测并保存为本地文件后,用osg显示点云。//osg显示点云文件void OSGShowPoint(char* FileName){ osg::ref_ptr<osg::Group> root = new osg::Group(); osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer; { osg::ref_ptr<osg::GraphicsContext::Traits&

2020-07-20 11:27:41 393

原创 学习日志2020.7.17 Qt+OSG+VS2017

因为要做雷达软件开发,这几天一直在配置环境装软件,走了不少弯路,把配置成功的过程记录下来。电脑操作系统是win7,编译工具用vs2017,Qt5.14.1。为了显示点云数据,需要配置osg库。主要参考:https://www.cnblogs.com/dalanjing/p/10639047.html但是这里有一些细节没有写明,导致我配置了三次才成功。在用cmake设置编译选项时,有一个地方要选择x64,否则默认选择是x32。。其他步骤照做就可以。接下来安装Qt visual studio to

2020-07-17 14:53:57 398

原创 学习日志2020.7.15 点云本地txt保存

把livoxSDK的代码修改一下,添加一个将每一帧内的点云数据逐个数据包保存为本地txt文件的方法:

2020-07-15 13:38:13 1114 3

原创 学习日志2020.7.14 解析Livox点云存储数据结构

点云数据存储方式终于有点眉目了。点云数据率是每秒十万点,每秒有20帧frame rate,每一帧包含50个左右数据包point packet,这50个数据包组合成一个临时数据包列表point packet list temp,所有的临时数据包列表组成完整的数据包列表point packet list,写入本地文件。算法层上,数据存储的最小单元是数据包point packet,每个数据包大小为1319字节byte,包含100个点的信息,这些信息包含100个点公用的头文件信息,和每个点单独的data信息,包

2020-07-14 11:05:38 4040 45

uint32_t格式转int格式算法

提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。

2020-07-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除