PCL交互选择ROI区域

news2025/4/19 16:27:31

PCL的配置和如何配准点云可见博主之前的博客

win10环境下PCL安装和配置回顾(一)_竹叶青lvye的博客-CSDN博客_pcl win10

win10环境下PCL安装和配置回顾(二)_竹叶青lvye的博客-CSDN博客_win10 安装pcl

PCL - 3D点云配准(registration)介绍_竹叶青lvye的博客-CSDN博客

其它的PCL方面常用的一些点云算法,可自己花时间去研读,这边想去简单实现下ROI区域交互式的选择,接下还是延续前面几篇博客所用的PCL的配置。

一. 生成测试点云

这边点云选择

mirrors / pointcloudlibrary / data · GitCode

里面的learn5.pcd点云

 这里自定义了一个旋转平移矩阵(将点云通过这个变换为另外一个点云),详细见如下代码:

#include <pcl/memory.h>  // for pcl::make_shared
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/point_representation.h>
#include <pcl/io/pcd_io.h>

#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/filter.h>

#include <pcl/features/normal_3d.h>

#include <pcl/registration/icp.h>
#include <pcl/registration/icp_nl.h>
#include <pcl/registration/transforms.h>

#include <pcl/visualization/pcl_visualizer.h>


#include <boost/thread/thread.hpp>

using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;

//convenient typedefs
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
typedef pcl::PointNormal PointNormalT;
typedef pcl::PointCloud<PointNormalT> PointCloudWithNormals;

int main()
{
	PointCloud::Ptr cloud_src(new PointCloud);
	PointCloud::Ptr cloud_tgt(new PointCloud);

	pcl::io::loadPCDFile("D:\\PCL\\data-master\\segmentation\\mOSD\\learn\\learn5.pcd", *cloud_src);

	Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();//定义绕X轴的旋转矩阵,并初始化为单位阵

	float theta = M_PI / 4; // The angle of rotation in radians
	transform_1(0, 0) = std::cos(theta);
	transform_1(0, 1) = -sin(theta);
	transform_1(1, 0) = sin(theta);
	transform_1(1, 1) = std::cos(theta);

	transform_1(0, 3) = 0.7f;
	transform_1(1, 3) = 0.6f;
	transform_1(2, 3) = 1.2f;

	pcl::transformPointCloud(*cloud_src, *cloud_tgt, transform_1);

	std::cout << "cloud_src size: " << cloud_src->size() << std::endl;
	std::cout << "cloud_target size: " << cloud_tgt->size() << std::endl;

	pcl::visualization::PCLVisualizer* p;
	int vp_1, vp_2;

	p = new pcl::visualization::PCLVisualizer("view");

	PointCloudColorHandlerCustom<PointT> src_h(cloud_src, 255, 0, 0);
	PointCloudColorHandlerCustom<PointT> tgt_h(cloud_tgt, 0, 255, 0);

	p->addPointCloud(cloud_src, src_h, "vp1_src");
	p->addPointCloud(cloud_tgt, tgt_h, "vp1_target");


	p->spin();

	return (0);
}

 运行结果如下:

二. 交互点选

接下来在变换前的点云数据上点选一个ROI区域,代码如下:

#include <pcl/memory.h>  // for pcl::make_shared
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/point_representation.h>
#include <pcl/io/pcd_io.h>

#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/filter.h>

#include <pcl/features/normal_3d.h>

#include <pcl/registration/icp.h>
#include <pcl/registration/icp_nl.h>
#include <pcl/registration/transforms.h>

#include <pcl/visualization/pcl_visualizer.h>

#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>

#include <boost/thread/thread.hpp>

using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;

//convenient typedefs
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
typedef pcl::PointNormal PointNormalT;
typedef pcl::PointCloud<PointNormalT> PointCloudWithNormals;

//Mutex 
boost::mutex cloud_mutex;

struct callback_args
{
	PointCloud::Ptr clicked_points_3d;
	pcl::visualization::PCLVisualizer::Ptr viewerPtr;
};

//点选函数
void pointPick_callback(const pcl::visualization::PointPickingEvent& event, void* args)
{
	struct callback_args* data = (struct callback_args*)args;
	if (event.getPointIndex() == -1)
	{
		return;
	}

	//提取当前点
	PointT current_point;
	event.getPoint(current_point.x, current_point.y, current_point.z);
	data->clicked_points_3d->points.push_back(current_point);

	//显示当前点
	pcl::visualization::PointCloudColorHandlerCustom<PointT> red(data->clicked_points_3d, 255, 0, 0);
	data->viewerPtr->removePointCloud("clicked_points");
	data->viewerPtr->addPointCloud(data->clicked_points_3d, red, "clicked_points");
	data->viewerPtr->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");
	cout << current_point << endl;
}


int main()
{
	PointCloud::Ptr cloud_src(new PointCloud);
	PointCloud::Ptr cloud_tgt(new PointCloud);

	pcl::io::loadPCDFile("D:\\PCL\\data-master\\segmentation\\mOSD\\learn\\learn5.pcd", *cloud_src);

	Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();//定义绕X轴的旋转矩阵,并初始化为单位阵

	float theta = M_PI / 4; // The angle of rotation in radians
	transform_1(0, 0) = std::cos(theta);
	transform_1(0, 1) = -sin(theta);
	transform_1(1, 0) = sin(theta);
	transform_1(1, 1) = std::cos(theta);

	transform_1(0, 3) = 0.7f;
	transform_1(1, 3) = 0.6f;
	transform_1(2, 3) = 1.2f;

	pcl::transformPointCloud(*cloud_src, *cloud_tgt, transform_1);

	std::cout << "cloud_src size: " << cloud_src->size() << std::endl;
	std::cout << "cloud_target size: " << cloud_tgt->size() << std::endl;

	

	pcl::visualization::PCLVisualizer* p;

	p = new pcl::visualization::PCLVisualizer("view");

	cloud_mutex.lock();    // for not overwriting the point cloud

	PointCloudColorHandlerCustom<PointT> src_h(cloud_src, 0, 0, 255);
	PointCloudColorHandlerCustom<PointT> tgt_h(cloud_tgt, 0, 255, 0);

	p->setBackgroundColor(0.5, 0.5, 0.1, 0); // 设置背景为深灰

	p->addPointCloud(cloud_src, src_h, "vp1_src");
	p->addPointCloud(cloud_tgt, tgt_h, "vp1_target");

	struct callback_args cb_args;
	PointCloud::Ptr clicked_points_3d(new PointCloud);

	cb_args.clicked_points_3d = clicked_points_3d;
	cb_args.viewerPtr = pcl::visualization::PCLVisualizer::Ptr(p);
	p->registerPointPickingCallback(pointPick_callback, (void*)&cb_args);

	cout << "->Shift + 鼠标左键选点,按 ‘Q’结束选点" << endl;

	p->spin();

	cout << "->选点结束" << endl;

	Eigen::Affine3f affine(transform_1);

	PointT conver_point = pcl::transformPoint(cb_args.clicked_points_3d->points[0], affine);
	std::cout << "use the affine to covert the point: " << std::endl;
	std::cout << conver_point << std::endl;

	cloud_mutex.unlock();

	while (!p->wasStopped())
	{
		p->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return (0);
}

运行程序,可看到如下先点选了蓝色点云上的一个角点,又鼠标点选了绿色点云上对应位置处的一角点。这个两个点云的点同时也在点云上show出来了。

 按了Q退出点选模式后,程序会将点云的绿色处的点去由变换矩阵变化下,算出来的值,可看到和上面鼠标点选的绿色点云的角点坐标是近似的。

 

三. 将点云上的ROI区域跟随目标的变换而变化,并在其变换后的点云数据上画出立体框

代码如下,在第一个点云上可以通过鼠标点选ROI区域,完毕后会在第二个点云上会产生一个ROI区域,可看到是跟随目标变化的。

#include <pcl/memory.h>  // for pcl::make_shared
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/point_representation.h>
#include <pcl/io/pcd_io.h>

#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/filter.h>

#include <pcl/features/normal_3d.h>

#include <pcl/registration/icp.h>
#include <pcl/registration/icp_nl.h>
#include <pcl/registration/transforms.h>

#include <pcl/visualization/pcl_visualizer.h>

#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>

#include <pcl/features/moment_of_inertia_estimation.h>

#include <boost/thread/thread.hpp>

using pcl::visualization::PointCloudColorHandlerGenericField;
using pcl::visualization::PointCloudColorHandlerCustom;

//convenient typedefs
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
typedef pcl::PointNormal PointNormalT;
typedef pcl::PointCloud<PointNormalT> PointCloudWithNormals;

pcl::PointCloud<PointT>::Ptr points;

//Mutex 
boost::mutex cloud_mutex;
int count = 0;



struct callback_args
{
	PointCloud::Ptr clicked_points_3d;
	PointCloud::Ptr clicked_points_3d_convert;
	pcl::visualization::PCLVisualizer::Ptr viewerPtr;
	Eigen::Affine3f affine;
};

//点选函数
void pointPick_callback(const pcl::visualization::PointPickingEvent& event, void* args)
{
	count++;

	struct callback_args* data = (struct callback_args*)args;
	if (event.getPointIndex() == -1)
	{
		return;
	}

	//提取当前点
	PointT current_point;
	event.getPoint(current_point.x, current_point.y, current_point.z);
	data->clicked_points_3d->points.push_back(current_point);

	//显示当前点
	pcl::visualization::PointCloudColorHandlerCustom<PointT> red(data->clicked_points_3d, 255, 0, 0);
	data->viewerPtr->removePointCloud("clicked_points");
	data->viewerPtr->addPointCloud(data->clicked_points_3d, red, "clicked_points");
	data->viewerPtr->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");

	//添加点索引号
	PointT position(current_point.x, current_point.y + 0.01, current_point.z);
	data->viewerPtr->addText3D(std::to_string(count), position, 0.1, 1,0,0);

	data->viewerPtr->resetCameraViewpoint();

	
	cout << current_point << endl;
	PointT convert_point = pcl::transformPoint(current_point, data->affine);
	data->clicked_points_3d_convert->points.push_back(convert_point);

	if (count == 6)
	{
		//方向包围盒OBB
		pcl::MomentOfInertiaEstimation <pcl::PointXYZ> feature_extractor;
		feature_extractor.setInputCloud(data->clicked_points_3d);
		feature_extractor.compute();

		pcl::PointXYZ min_point_OBB;
		pcl::PointXYZ max_point_OBB;
		pcl::PointXYZ position_OBB;
		Eigen::Matrix3f rotational_matrix_OBB;
		feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);

		Eigen::Vector3f position(position_OBB.x, position_OBB.y, position_OBB.z);
		Eigen::Quaternionf quat(rotational_matrix_OBB);
		data->viewerPtr->addCube(position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");
		data->viewerPtr->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBB");

		
		feature_extractor.setInputCloud(data->clicked_points_3d_convert);
		feature_extractor.compute();

		feature_extractor.getOBB(min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);

		Eigen::Vector3f positionConvert(position_OBB.x, position_OBB.y, position_OBB.z);
		Eigen::Quaternionf quatConvert(rotational_matrix_OBB);

		data->viewerPtr->addCube(positionConvert, quatConvert, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBBConvert");
		data->viewerPtr->setShapeRenderingProperties(pcl::visualization::PCL_VISUALIZER_REPRESENTATION, pcl::visualization::PCL_VISUALIZER_REPRESENTATION_WIREFRAME, "OBBConvert");
	}
}


int main()
{
	PointCloud::Ptr cloud_src(new PointCloud);
	PointCloud::Ptr cloud_tgt(new PointCloud);

	pcl::io::loadPCDFile("D:\\PCL\\data-master\\segmentation\\mOSD\\learn\\learn5.pcd", *cloud_src);

	Eigen::Matrix4f transform_1 = Eigen::Matrix4f::Identity();//定义绕X轴的旋转矩阵,并初始化为单位阵

	float theta = M_PI / 4; // The angle of rotation in radians
	transform_1(0, 0) = std::cos(theta);
	transform_1(0, 1) = -sin(theta);
	transform_1(1, 0) = sin(theta);
	transform_1(1, 1) = std::cos(theta);

	transform_1(0, 3) = 0.7f;
	transform_1(1, 3) = 0.6f;
	transform_1(2, 3) = 1.2f;

	pcl::transformPointCloud(*cloud_src, *cloud_tgt, transform_1);

	std::cout << "cloud_src size: " << cloud_src->size() << std::endl;
	std::cout << "cloud_target size: " << cloud_tgt->size() << std::endl;

	

	pcl::visualization::PCLVisualizer* p;

	p = new pcl::visualization::PCLVisualizer("view");

	cloud_mutex.lock();    // for not overwriting the point cloud

	PointCloudColorHandlerCustom<PointT> src_h(cloud_src, 0, 0, 255);
	PointCloudColorHandlerCustom<PointT> tgt_h(cloud_tgt, 0, 255, 0);

	p->setBackgroundColor(0.5, 0.5, 0.1, 0); // 设置背景为深灰

	p->addPointCloud(cloud_src, src_h, "vp1_src");
	p->addPointCloud(cloud_tgt, tgt_h, "vp1_target");

	struct callback_args cb_args;
	PointCloud::Ptr clicked_points_3d(new PointCloud);
	PointCloud::Ptr clicked_points_3d_convert(new PointCloud);

	cb_args.clicked_points_3d = clicked_points_3d;
	cb_args.clicked_points_3d_convert = clicked_points_3d_convert;

	cb_args.viewerPtr = pcl::visualization::PCLVisualizer::Ptr(p);
	//cb_args.viewerPtr->addCoordinateSystem(0.5);
	PointT position(0, 0, 0);
	PointT positionx(1, 0, 0);
	PointT positiony(0, 1, 0);
	PointT positionz(0, 0, 1);
	cb_args.viewerPtr->addArrow<PointT,PointT>(positionx, position,0,0,1,false, "x");
	cb_args.viewerPtr->addArrow<PointT, PointT>(positiony, position, 0,1, 0,false, "y");
	cb_args.viewerPtr->addArrow<PointT, PointT>(positionz, position, 1, 0, 0,false, "z");

	cb_args.viewerPtr->addText3D("x", positionx, 0.2, 0, 0, 1,"x1");
	cb_args.viewerPtr->addText3D("y", positiony, 0.2, 0, 1, 0,"y1");
	

	Eigen::Affine3f affine(transform_1);
	cb_args.affine = affine;

	p->registerPointPickingCallback(pointPick_callback, (void*)&cb_args);

	cout << "->Shift + 鼠标左键选点,按 ‘Q’结束选点" << endl;

	p->spin();

	cout << "->选点结束" << endl;

	

	PointT conver_point = pcl::transformPoint(cb_args.clicked_points_3d->points[0], affine);
	std::cout << "use the affine to covert the point: " << std::endl;
	std::cout << conver_point << std::endl;

	cloud_mutex.unlock();

	while (!p->wasStopped())
	{
		p->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	return (0);
}

执行效果如下:

 可看到,此段代码实现了ROI区域跟随点云变化的功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

状态保持-JWT

“ Web的状态保持技术 -JWT&#xff08;Json Web Token&#xff09;” 在分布式微服务技术流行的今天&#xff0c;大型网站对JWT的使用愈加频繁&#xff0c;相比较于传统的session cookie。 HTTP 是一个无状态的协议&#xff0c;何为无状态呢&#xff1f;就是说这本次请求和上次…

【毕业设计】67-基于单片机的三相电压型SPWM逆变器控制设计及应用(仿真、原理图、源代码、低重复参考文档、答辩PPT、英文文献)

【毕业设计】67-基于单片机的三相电压型SPWM逆变器控制设计及应用&#xff08;仿真、原理图、源代码、低重复参考文档、答辩PPT、英文文献&#xff09; 文章目录【毕业设计】67-基于单片机的三相电压型SPWM逆变器控制设计及应用&#xff08;仿真、原理图、源代码、低重复参考文…

网站文章采集器-万能文章采集器

随着时代的发展。互联网无时不刻地出现在我们的生活中&#xff0c;大家也越来越注重效率&#xff0c;今天小编就给大家来分享一款网站文章采集器。只需要点几下鼠标就能轻松获取数据&#xff0c;不管是导出本地还是发布到网上。网站人员可以实现自动采集&#xff0c;定时发布&a…

[计算机毕业设计]食品安全数据的关联分析模型的应用

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

idea里面完整创建maven项目(包含如何使用)

目录 前言&#xff1a; 1.Maven和Maven Archetype区别&#xff1f; 2.创建maven项目之前的步骤&#xff08;必看&#xff09; 一、创建maven 1.打开idea--->文件--->新建--->项目 2.新建项目--->自定义项目名称--->选择Maven-->创建 3. 创建成功 二、…

微信小程序连接蓝牙汉印HM-A300L标签打印机

需求&#xff1a; 参考文章&#xff1a; 微信小程序实现蓝牙打印 打印机CPCL编程参考手册&#xff08;CPCL 语言&#xff09; 蓝牙打印机CPCL编程手册~汉印HM-A300 无用小知识&#xff1a; A300系列&#xff1a;先将打印机关机然后装好纸&#xff0c;同时按住屏幕左右两边的按…

UDS诊断网络层ISO15765-2(CAN)

诊断协议那些事儿 本文为诊断协议那些事儿专栏文章&#xff0c;从一个 ECU 到另一个 ECU&#xff0c;或外部诊断设备和一个 ECU 之间的通信&#xff0c;不仅依赖前文介绍的诊断寻址方式&#xff0c;更需要关注数据的传输&#xff0c;依赖网络层、传输层协议去完成&#xff0c;…

[附源码]java毕业设计社团管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2022.11.09第6次Javaweb上机——实现登录欢迎页面

前情回顾 Myeclipse的安装教程_科大云炬的博客-CSDN博客 【JavaWeb第1次上机练习】安装Tomcat并在本地浏览器成功运行第一个Hello world网站_科大云炬的博客-CSDN博客 【第2次JavaWeb上机练习】_科大云炬的博客-CSDN博客 第3次 JavaWeb上机练习&#xff1a;Servlet基础作业…

python工作任务流flow实时框架:prefect

python工作任务流flow实时框架&#xff1a;prefect prefect是一个python的工作任务流调度实时框架&#xff0c;prefect可以快速构建平台系统复杂模块间工作流的监测。当平台系统模块之间的调用链越来越复杂时候&#xff0c;任务执行起来&#xff0c;已经很难盘点清楚程序逻辑和…

删除链表中重复元素的问题

目录 一、删除所有重复元素&#xff0c;使每个元素只出现一次 1.1带头链表解法 1.2 递归方法 二、删除所有重复数字结点&#xff0c;只留下不同数字 2.1带头链表解法 2.2 递归方法 一、删除所有重复元素&#xff0c;使每个元素只出现一次 给定一个已排序的链表的头 hea…

Android App开发实战项目之模仿美图秀秀的抠图工具(附源码 简单易懂 可直接使用)

需要图片集和源码请点赞关注收藏后评论区留言~~~ 所谓抠图神器&#xff0c;就是从一副图片中扣出用户想要的某块区域 一、需求描述 美图的修图功能如此强大&#xff0c;离不开专业的图片加工技术&#xff0c;抠图便是其中重要的一项功能。在App界面底部点击抠图按钮&#xff…

mysql查询:行转列与列转行

目录 1. 行转列 1.1 什么是行转列 1.2 准备工作 1.3 行转列的实现原理 2. 列转行 2.1 什么是列转行 2.2 准备工作 2.3 列转行的实现原理 3. 总结 1. 行转列 1.1 什么是行转列 从表面理解&#xff0c;就是表里存储在行上的数据&#xff0c;在查询结果里展示在列上面。举…

基于stm32单片机随机数自动摇号抽奖系统

资料编号&#xff1a;099 下面是相关功能视频演示&#xff1a; 99-基于stm32单片机随机数自动摇号抽奖系统&#xff08;源码仿真全套资料&#xff09;采用stm32单片机作为主控&#xff0c;LCD1602显示&#xff0c;通过按键来重置生成随机数&#xff0c;类似于摇号和抽奖系统 …

如何实现广义的元交易(Meta Transaction)

在合约内启用元交易是一个强大的补充。要求用户持有ETH来支付Gas一直以来都是而且仍然是新用户进入的最大挑战之一。如果只是简单的点击,谁知道现在会有多少人在使用以太坊? 但有时,解决方案可以在你的合约中加入元交易能力。实现起来可能比你想象的要容易。 什么是元交易?…

(带你分分种学会linux的文件类型和软硬链接)linxu的文件类型(硬链接和软链接详解)

文章目录一&#xff0c;时区部分1&#xff0c;时区状态的展示2,列出所有时区二&#xff0c;linux的文件类型1&#xff0c;列出目录和文件类型2&#xff0c;查看文件类型和状态并且修改用户密码3&#xff0c;文件类型表4&#xff0c;文件的三次修改时间三&#xff0c;linux的软硬…

记录Manjaro Linux安装nvidia显卡驱动失败的经历

我的Manjaro: 2022.11.19的最新系统&#xff0c;通过manjaro-kde-21.3.7-220816-linux515.iso安装&#xff0c;然后通过pacman -Syyu更新的我的设备&#xff1a; CPU intel 12700H&#xff0c;大小核架构&#xff0c;使用系统默认的linux5.15内核会发现启动firefox浏览器的速度…

LeetCode 142. 环形链表 II

题目链接&#xff1a;https://leetcode.cn/problems/linked-list-cycle-ii/ 思路如下&#xff1a; 用两个指针 fast, slow 同时从起点开始走&#xff0c;fast 每次走两步&#xff0c;slow 每次走一步。 如果过程中 fast 走到 null&#xff0c;则说明不存在环。否则当 fast 和…

基于Python3.6配置开发环境

前言 最近在CTF上遇到了瓶颈&#xff0c;本人不会python&#xff0c;导致有些题做不出来。而且python的实用性实在太强了&#xff0c;所以就找了一个培训机构的课程边学习边实践。现将经验总结&#xff0c;分享给大家。 正文 1、配置python安装路径和环境变量 怎么下载pyth…

【Acwing】最短路+二分 通信线路

340. 通信线路 - AcWing题库 题意&#xff1a; 思路&#xff1a; 首先因为贪心&#xff0c;免费升级的肯定是最贵的那几根 因此这道题可以简化为&#xff1a; 给定一张图&#xff0c;求结点1到结点N的所有路径中第K1大的边权的最小值 可以发现我们要求剩下的边中最大值的最…