第五周编程学习(3.27-4.2)

目录

第一天3.27 星期一   时间计算

第二天3.28  星期二  CMake用法

第三天3.29  星期三  navicat15的安装

第四天3.30  星期四    交叉表法、CSF

第五天3.31  星期五   指针和引用、PCDReader和loadPCDFile

第六天4.1  星期六   Hough变换、include

第七天4.2  星期日  点云颜色、离群点去除算法

本周总结:


第一天3.27 星期一   时间计算

今天主要学习了Hough变换、欧氏距离聚类算法、布料模拟滤波算法,但有待进一步深入学习,另一方向,今天还学习了C++和Python的计算运行时间的函数,例子如下:

C++第一种方法:

#include<iostream>
#include<ctime>

using namespace std;

const int N = 999;
int main() {

    clock_t start, end;

    start = clock();
    printf("Start: %ld\n", start);
    int a,sum = 0;
    for (int i = 0; i < N; i++) {
        //一个用时为0.002s的小循环
        a = i * i;
        sum += a;
    }
    printf("%ld", sum);
    std::cout << sum << endl;
    end = clock();
    printf("End: %ld\n", end);

    double elapsedTime = static_cast<double>(end - start) / CLOCKS_PER_SEC;
    //clock()以毫秒的形式展现,因此需要除以 CLOCKS_PER_SEC 来实现转换
    //static_cast<double>的作用是将结果转换为double类型
    printf("CPU PROCESSING TIME: %f", elapsedTime);
    return 0;
}

C++第二种方法(推荐):

#include<ctime>    
auto start = std::clock();

auto end = std::clock();
std::cerr << "耗时" << std::difftime(end, start) << "ms" << std::endl;

Python:

import time

def powers(limit):
    sum = 0
    for i in range(0,limit):
        a = i*i
        sum += a
    return sum


start = time.time()

print(powers(999))
end = time.time()

print(end-start)  # 1.0257349014282227 (秒)

第二天3.28  星期二  CMake用法

今天熟悉了软著的提交流程,同时也学习了CMake的使用方法,同时也完成了两种软件以及C++代码对CSF算法的实现。

一、使用CMake的基本步骤:

        1.将list拖进去,建立build,设置路径 

        2.按configure,报红,进行参数设置

        3.再按configure,有些需对vcxproj文件进行修改

        4.generate

        5.打开VS,生成ALL_BUILD

        6.在自己的项目里分别添加include,lib,依赖项

二、VS中批量注释:Ctrl+K+C

三、VScode中放大缩小:Ctrl+-

四、PCL库中未有CSF,所有要从外部接入

五、几种输出类型   不同平台下不一样

%lld 输出有符号64位的

%llu 输出无符号64位的

%llx 输出64位16进制数的

第三天3.29  星期三  navicat15的安装

今天主要学习了navicat15的破解过程,其结果如下:

1、在本站下载并解压,可得到navicat150_sqlite_cs_x64.exe源程序以及注册机

2、双击源程序开始安装
3、将注册机文件夹中的文件复制到安装目录下替换,打开注册机,选择SQLite,然后点击patch按钮,提示navicat. exe -x64-> Cracked!点击确定,先不要退出注册机
4、运行软件,点击注册,进入注册界面
5、点击注册机generate生成按钮,将生成的注册序列号复制到窗口中,点击激活
6、出现提示,点击手动激活
7、将软件中的请求码复制到注册机框区,点击下方的generate生成新的激活码,激活码生成并自动填充到软件中,点击下方的激活按钮

注:如果时间长了出现问题失去激活,重新激活不了,那就重新安装软件

第四天3.30  星期四    交叉表法、CSF

一、了解了论文中随机点和真实DEM的回归的问题

500个随机点选择之后,可知道其x坐标,对生成DEM和真实DEM的y坐标进行计算即可

二、了解点云精度的评价指标——交叉表法

交叉表法是通过计算点云采样点在真实表面和重建表面中的分类情况来评估重建表面的精度。这种方法将点云表面划分为四个部分:真实表面上的正确分类点(TP, True Positive)、真实表面上的错误分类点(FN, False Negative)、重建表面上的错误分类点(FP, False Positive)和重建表面上的正确分类点(TN, True Negative)。其中,TP表示真实表面上被正确分类的点数,FN表示真实表面上被错误分类的点数,FP表示被重建表面错误分类的点数,TN表示被正确分类为非表面的点数。

通过计算这些分类,可以得到四个统计量:准确度(Accuracy)、精度(Precision)、召回率(Recall)和F1分数(F1 score)。其中,准确度表示正确分类的点数占所有点数的比例,精度表示重建表面上正确分类的点数占所有被分类为表面的点数的比例,召回率表示真实表面上正确分类的点数占所有真实表面上的点数的比例,F1分数则是精度和召回率的调和平均数,可以综合评估重建表面的精度。

三、CSF的相关代码的学习

#include "E:\yan1\exercise\C_C++\PCL\CSF\src\CSF.h"
#include "E:\yan1\exercise\C_C++\PCL\CSF\src\point_cloud.h"

int main(int argc, char** argv)
{

	//1、文件读取
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//创建点云容器,点云类型xyz
	//判断是否读取失败
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("ys.pcd ", *cloud) == -1)
	{
		//读取失败不仅要跳出提示信息,还要返回一个错误值-1
		PCL_ERROR("ply文件读取失败 \n");
		return(-1);		
	}

	//CSF滤波模块的参数设置
	CSF csfilter;
	csfilter.params.bSloopSmooth = true;  //是否后处理
	csfilter.params.cloth_resolution = 1.0; //布料分辨率
	csfilter.params.rigidness = 2;  //布料硬度,也就是节点回调次数
	csfilter.params.time_step = 0.65;	//时间步长
	csfilter.params.class_threshold = 0.5; //地面点阈值,距离布料0.5M以下的为地面点
	csfilter.params.interations = 500; //迭代次数500

	std::vector<csf::Point> csfPoints;
	for (int i = 0; i < cloud->points.size(); i++)
	{
		csf::Point a;
		a.x = cloud->points[i].x;
		a.y = cloud->points[i].y;
		a.z = cloud->points[i].z;
		csfPoints.push_back(a);
	}
	csfilter.setPointCloud(csfPoints);

	std::vector<int> ground_index;
	std::vector<int> non_ground_index;
	csfilter.do_filtering(ground_index, non_ground_index);



	pcl::PointCloud<pcl::PointXYZ>::Ptr dimiancloud(new pcl::PointCloud<pcl::PointXYZ>);//地面
	pcl::PointCloud<pcl::PointXYZ>::Ptr feidimiancloud(new pcl::PointCloud<pcl::PointXYZ>);//非地面
	for (int i = 0; i < ground_index.size(); i++)
	{
		pcl::PointXYZ a;
		a.x = csfPoints[ground_index[i]].x;
		a.y = csfPoints[ground_index[i]].y;
		a.z = csfPoints[ground_index[i]].z;
		dimiancloud->push_back(a);
	}
	for (int i = 0; i < non_ground_index.size(); i++)
	{
		pcl::PointXYZ a;
		a.x = csfPoints[non_ground_index[i]].x;
		a.y = csfPoints[non_ground_index[i]].y;
		a.z = csfPoints[non_ground_index[i]].z;
		feidimiancloud->push_back(a);
	}


	std::cerr << " 地面点保存 " << std::endl;
	pcl::io::savePCDFileBinary("dimian.pcd", *dimiancloud);
	std::cerr << " 非地面点保存 " << std::endl;
	pcl::io::savePCDFileBinary("feidimian.pcd", *feidimiancloud);

	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("viewer"));
	pcl::PointCloud<pcl::PointNormal>::Ptr dimian(new pcl::PointCloud<pcl::PointNormal>);
	pcl::io::loadPCDFile("dimian.pcd", *dimian);
	std::cerr << " 地面点显示 " << std::endl;
	viewer->addPointCloud<pcl::PointNormal>(dimian, "cloud");
	while (!viewer->wasStopped())
	{
		viewer->spinOnce();
	}

	std::cerr << " 运行完毕 " << std::endl;

	system("pause");
	return 0;
}

第五天3.31  星期五   指针和引用、PCDReader和loadPCDFile

1.pcl::PCDReader和pcl::io::loadPCDFile的区别

都能实现将PCD文件读入pcl::PointCloud的功能,但pcl::PCDReader使一个简单的接口,而pcl::io::loadPCDFile是一个模板函数,更加灵活

2.pcl::PointXYZI和pcl::PointXYZ的区别

pcl::PointXYZI除了包含x,y,z信息外,还包含强度信息

3.指针和引用

指针和引用是两种不同的概念。指针是一个变量,保存着另一个对象的内存地址,而引用则是对象的一个别名,可以直接访问对象的值。使用*可以将指针所指向的对象解引用得到其实际的值,而使用引用则可以直接访问对象的值,二者并不相同。

在函数参数中,使用指针作为参数,可以将函数内部对指针指向对象的修改保留到函数外部,而使用引用作为参数,则可以使得函数对参数进行修改,这种修改同样会保留到函数外部。但在函数调用时,使用引用的语法更加简洁,而且可以避免对指针的解引用操作,因此更为常见。    

解决方法:新建一个项目,将代码复制进去即可        

第六天4.1  星期六   Hough变换、include

1.Hough变换≠极坐标

Hough变换中seita和rou是不变的

2.在代码中添加QtCharts头文件,引入命名空间时:

一般我们最好在cpp文件中添加头文件和引入命名空间,尽量避免在.h文件中引入(这里为了方便,代码简洁直接在头文件中引入命名空间),而在cpp文件中引入命名空间需要在ui_widget.h文件前,否则编译会失败,因为在ui文件中会用到QChartView类。

3.#include的库太多会降低运行速度吗

在程序运行时,如果没有调用库文件中的函数或变量,库文件的代码也不会被加载到内存中,因此不会影响程序的运行速度和内存占用。

但是,包含过多的库文件可能会导致程序的可维护性下降。此外,如果库文件中存在安全漏洞或错误,即使程序没有调用库文件中的函数或变量,这些漏洞或错误仍可能会对程序产生不良影响,例如导致程序崩溃或者受到攻击。

第七天4.2  星期日  点云颜色、离群点去除算法

1.点云没有颜色怎么办

        1)使用代码给点云赋予颜色  PointXYZRGB模板

        2)使用PCM给点云赋予颜色后再另存为

        3)Scalar field,使用cloudcompare的设置颜色功能

2.pcl::StatisticalOutlierRemoval::setMeanK() 和 pcl::StatisticalOutlierRemoval::setStddevMulThresh()的区别与联系

pcl::StatisticalOutlierRemoval 是一种基于统计学原理的离群点去除算法。需要设置以下两个参数:

setMeanK():设置用于计算点云中每个点的邻域点的数量,即每个点周围的临近点的数量。

setStddevMulThresh():设置标准差乘数阈值,该值用于确定哪些点将被视为离群点,标准差是指所有数据点与其均值之间的平均差。

算法流程如下:

        1)对于每个点,计算其邻域点的平均值和标准差。

        2)判断每个点是否为离群点。如果其邻域点的平均值与该点之间的距离超过了设定的阈值,该点将被标记为离群点。

        3)标记为离群点的点将从点云中删除。

        4)经过此算法处理后,点云中的离群点将被过滤掉。

3.出现报错:严重性   代码   说明 项目 文件  行  禁止显示状态 错误     LNK1104   无法打开文件“libboost_date_time-vc142-mt-gd-x641_75.lib”    DEM1        E:\yan1\exercise\C_C++\PCL\Establishment\DEM1\DEM1\LINK   

本周总结:

1.本周对CMake有了一个全新且完整的认识,已学会使用该软件

2.navicat15数据库软件破解的全过程

3.本周重点学习了CSF算法,包括代码与软件

4.学到了许多概念的区分:诸如指针和引用、Hough变换和极坐标等

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值