CSAPP-2-datalab
2 data lab2.1 bitXor
x^y only use ~ and &
异或:不相同时为1,相同为0——- 计算不是同时为0情况和不是同时为1的情况 然后进行与
例如 x[0011] y[0101]
找出同时为1的情况 则 x&y = [0001]
找出同时为0的情况 则相反 ~x[1100] & ~y[1010] = [1000]
找出这两种单独情况然后再取非 按位与就是异或门实现
代码实现:
123int bitXor(int x, int y) { return ~(~x&~y)&~(x&y);}
2.2 tmin
only use !~ & ^ | + << >>
返回最小补码整数
题目要求机器在32位机器上运行 int的类型位32位
补码最小值为 符号位为1 其余为0 即为最小值,因此可以将0X1[00000000,00000000,00000000,00000001] 左移3 ...
点云多尺度滤波
一、引言在降采样中想要充分保留边界信息,但是采用体素降采样,均匀降采样等,都是对全局的点云信息进行降采样,无法做到分区域的降采样。因此对点云的曲率进行估计,作为额外的补充信息对点云进行降采样。即对点云做条件滤波。曲率信息作为滤波条件。
运行环境:Ubuntu18.04 + PCL1.11
二、实现主要步骤如下:
估计点云的法向量和曲率
对点云法向量和曲率进行字段连接
根据曲率大小进行分区域降采样
2.1估计点云的法向量和曲率利用PCL库对点云的法向量和曲率进行估计。要注意根据实际的情况设置合适的点云邻域半径。
12345678910pcl::NormalEstimationOMP<pcl::PointXYZ,pcl::Normal>n;pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl: ...
点云特征识别-圆孔特征识别
一、引言基于点的特征识别算法相对较少,刚好又需要对项目中的圆孔特征进行滤波,故采取点云密度+RANSAC对圆孔特征进行识别和滤波。
首先,根据采集点云的密度差异提取出包含圆孔特征,边界特征的点云集合;
然后,利用RANSAC进行圆孔拟合;
最后,获取拟合的圆孔的半径,圆心利用包围盒进行去除。
二、实现2.1点云密度差异聚类计算点云数据的点密度差异,提取出密度差异的特征点云,并进行欧式聚类,具体实现见点云计算点密度特征 | Sifanのblog (liangzhouzz.github.io)
原始图像
提取后的图像:
2.2点云聚类将经过密度提取后的点云进行聚类,代码如下:
1234567891011pcl::search::KdTree<pcl::PointXYZ>::Ptr kd_tree(new pcl::search::KdTree<pcl::PointXYZ>); //创建kdtreekd_tree->setInputCloud(cloud);std::vector<pcl::PointIndices>cluster_ ...
点云基础滤波算法
一、点云滤波介绍当激光或结构光设备采集的时候会因为被采集物体的表面材料,环境带来许多的噪声点(也叫做离群点),也会因为点云数据冗余,需要进行降采样,便于后续处理数据量的减少。
本文借助PCL开源库,实现基础的点云滤波算法。
二、具体实现2.1直通滤波直通滤波是在给定的通道上(x、y、z等)进行给定区域的滤波,在自动驾驶中一般用来进行地面的滤除。
123456789101112131415#include<pcl/filters/passthrough.h>//头文件cout<<"----------直通滤波开始-------------"<<endl;cout<<*cloud<<endl;pcl::PointXYZ minPt, maxPt;pcl::getMinMax3D(*cloud,minPt,maxPt);//获得输入点云的最大最小边界//关键配置代码pcl::PassThrough<pcl::PointXYZ>PassZ;PassZ.setInputCloud(cloud);//传入点 ...
点云计算点密度特征
一、点云密度介绍点云密度反应了点云的密集程度和分布,是点云的重要特征信息;其与采集设备的分辨率,被采集物体的表面材料有关。
广义上的点云密度有两种方法表示:
①距离密度,即给定需要计算点的数量,统计每个邻近点到该点的距离作为密度;
②点密度,即给定邻域半径,统计该点领域半径内的点数量作为点密度。
二、具体实现主要步骤如下:
指定搜索半径radius和最小点密度阈值minPts。可以先用cloudcompare查看
用radiusSearch统计种子点的在radius局部点的数量,作为点的密度值densiities。
遍历每个点的密度,满足密度阈值的点放入点集中。
2.1指定搜索半径和密度阈值这一步可以指定搜索半径和阈值,可以把点云文件导入cloudcompare内查看,以便设置更合适的阈值。
导入文件–>Tools–>Other–>Compute geometric features
设置半径和勾选要计算的特征即可,这里我们勾选局部邻域内点的数量作为密度。
拖动状态栏即可查看,设置合适的阈值。
2.2计算点的局部密度首先构建kdtree,使用k ...