SUSAN关键点检测以及SAC-IA粗配准

一、SUSAN关键点检测

C++

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/common/common_headers.h>
#include <pcl/keypoints/susan.h>
using namespace std;


int main(int, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//要配准变化的点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target(new pcl::PointCloud<pcl::PointXYZ>);//目标点云(不变的)
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view1.pcd", *cloud) == -1)
	{
		PCL_ERROR("加载点云失败\n");
	}
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view2.pcd", *cloud_target) == -1)
	{
		PCL_ERROR("加载点云失败\n");
	}
	

	pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZI>);
	pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints2(new pcl::PointCloud<pcl::PointXYZI>);
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());

	pcl::SUSANKeypoint<pcl::PointXYZ, pcl::PointXYZI> SUSAN1;
	SUSAN1.setInputCloud(cloud);
	SUSAN1.setSearchMethod(tree);
	SUSAN1.setRadius(3.0f);                  // 设置正常估计和非最大抑制的半径
	SUSAN1.setDistanceThreshold(0.01f);      // 设置距离阈值
	SUSAN1.setAngularThreshold(0.01f);       // 设置用于角点检测的角度阈值
	SUSAN1.setIntensityThreshold(0.1f);      // 设置用于角点检测的强度阈值
	SUSAN1.setNonMaxSupression(true);        // 对响应应用非最大值抑制,以保持最强角。
	SUSAN1.compute(*keypoints1);
	pcl::PointCloud<pcl::PointXYZ>::Ptr keys1(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::copyPointCloud(*keypoints1, *keys1);


	pcl::SUSANKeypoint<pcl::PointXYZ, pcl::PointXYZI> SUSAN2;
	SUSAN2.setInputCloud(cloud_target);
	SUSAN2.setSearchMethod(tree);
	SUSAN2.setRadius(3.0f);                  // 设置正常估计和非最大抑制的半径
	SUSAN2.setDistanceThreshold(0.01f);      // 设置距离阈值
	SUSAN2.setAngularThreshold(0.01f);       // 设置用于角点检测的角度阈值
	SUSAN2.setIntensityThreshold(0.1f);      // 设置用于角点检测的强度阈值
	SUSAN2.setNonMaxSupression(true);        // 对响应应用非最大值抑制,以保持最强角。
	SUSAN2.compute(*keypoints2);
	pcl::PointCloud<pcl::PointXYZ>::Ptr keys2(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::copyPointCloud(*keypoints2, *keys2);


	关键点显示
	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer1(new pcl::visualization::PCLVisualizer("v1"));
	viewer1->setBackgroundColor(0, 0, 0);
	viewer1->setWindowName("SUSAN");
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> in_color1(keys1, 0.0, 255.0, 0.0);
	viewer1->addPointCloud<pcl::PointXYZ>(keys1, in_color1, "key_color");//特征点
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "key_color");
	while (!viewer1->wasStopped())
	{
		viewer1->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}

	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer2(new pcl::visualization::PCLVisualizer("v2"));
	viewer2->setBackgroundColor(0, 0, 0);
	viewer2->setWindowName("SUSAN");
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> in_color2(keys2, 0.0, 255.0, 0.0);
	viewer2->addPointCloud<pcl::PointXYZ>(keys2, in_color2, "key_color");//特征点
	viewer2->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "key_color");
	while (!viewer2->wasStopped())
	{
		viewer2->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}

	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer3(new pcl::visualization::PCLVisualizer("v3"));
	viewer3->setBackgroundColor(0, 0, 0);
	viewer3->setWindowName("SUSAN");
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> in_color3(cloud, 0.0, 255.0, 0.0);
	viewer3->addPointCloud<pcl::PointXYZ>(cloud, in_color3, "in_color");
	viewer3->addPointCloud<pcl::PointXYZ>(keys1, "key_color");//特征点
	viewer3->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "key_color");
	viewer3->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "key_color");
	while (!viewer3->wasStopped())
	{
		viewer3->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}

	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer4(new pcl::visualization::PCLVisualizer("v4"));
	viewer4->setBackgroundColor(0, 0, 0);
	viewer4->setWindowName("SUSAN");
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> in_color4(cloud_target, 0.0, 255.0, 0.0);
	viewer4->addPointCloud<pcl::PointXYZ>(cloud_target, in_color4, "in_color");
	viewer4->addPointCloud<pcl::PointXYZ>(keys2, "key_color");//特征点
	viewer4->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "key_color");
	viewer4->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1.0, 0.0, 0.0, "key_color");
	while (!viewer4->wasStopped())
	{
		viewer4->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}
	return 0;
}


关键代码解析: 

pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZI>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
pcl::SUSANKeypoint<pcl::PointXYZ, pcl::PointXYZI> SUSAN1;
SUSAN1.setInputCloud(cloud);
SUSAN1.setSearchMethod(tree);
SUSAN1.setRadius(3.0f);                  // 设置正常估计和非最大抑制的半径
SUSAN1.setDistanceThreshold(0.01f);      // 设置距离阈值
SUSAN1.setAngularThreshold(0.01f);       // 设置用于角点检测的角度阈值
SUSAN1.setIntensityThreshold(0.1f);      // 设置用于角点检测的强度阈值
SUSAN1.setNonMaxSupression(true);        // 对响应应用非最大值抑制,以保持最强角。
SUSAN1.compute(*keypoints1);
pcl::PointCloud<pcl::PointXYZ>::Ptr keys1(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud(*keypoints1, *keys1);
  1. pcl::PointCloud<pcl::PointXYZI>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZI>);:创建了一个指向存储PointXYZI类型的点云的指针,该点云用于存储检测到的关键点的坐标及其强度信息。

  2. pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());:创建了一个KD树,用于最近邻搜索。

  3. pcl::SUSANKeypoint<pcl::PointXYZ, pcl::PointXYZI> SUSAN1;:创建了一个SUSAN关键点检测器对象。

  4. SUSAN1.setInputCloud(cloud);:设置输入点云数据。这里假设cloud是一个pcl::PointCloud<pcl::PointXYZ>类型的点云数据。

  5. SUSAN1.setSearchMethod(tree);:设置最近邻搜索方法为之前创建的KD树。

  6. SUSAN1.setRadius(3.0f);:设置用于角点检测的半径大小。这个半径决定了在每个点周围的搜索区域的大小,较大的半径可能会导致检测到更多的关键点。

  7. SUSAN1.setDistanceThreshold(0.01f);:设置距离阈值。这个阈值用于过滤掉与周围点距离过远的候选点,较大的值将允许更远的点被考虑为关键点。

  8. SUSAN1.setAngularThreshold(0.01f);:设置角度阈值。这个阈值用于控制在检测角点时考虑的角度范围,较大的值将允许更大的角度范围内的点被检测为关键点。

  9. SUSAN1.setIntensityThreshold(0.1f);:设置强度阈值。这个阈值用于控制在检测角点时考虑的点云强度(或灰度)的范围,较大的值将允许更强或更弱的点被检测为关键点。

  10. SUSAN1.setNonMaxSupression(true);:设置是否对响应应用非最大值抑制,以保持最强的角点。

  11. SUSAN1.compute(*keypoints1);:运行SUSAN关键点检测算法,将检测到的关键点存储在keypoints1中。

  12. pcl::PointCloud<pcl::PointXYZ>::Ptr keys1(new pcl::PointCloud<pcl::PointXYZ>);:创建了一个新的点云对象,用于存储不带强度信息的关键点。

  13. pcl::copyPointCloud(*keypoints1, *keys1);:将带有强度信息的关键点复制到新的点云对象keys1中,去除强度信息,得到不带强度的关键点。

参数的变大或变小会直接影响到检测到的关键点的数量、位置和质量。例如,增加半径、距离阈值、角度阈值和强度阈值可能会导致检测到更多的关键点,而减小这些值则会使得更少的点被检测为关键点。

结果:

输入点云的关键点 

输出点云的关键点  

输入点云的关键点与输入点云一起展示   

输出点云的关键点与输出点云一起展示 

二、SUSAN关键点检测及SAC-IA粗配准   

C++

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/features/fpfh_omp.h>  
#include <pcl/common/common_headers.h>
#include <pcl/registration/ia_ransac.h>
#include <pcl/keypoints/susan.h>
using namespace std;
void extract_keypoint(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& keypoint)
{
	pcl::SUSANKeypoint<pcl::PointXYZ, pcl::PointXYZI> SUSAN;
	pcl::PointCloud<pcl::PointXYZI>::Ptr keypoint1(new pcl::PointCloud<pcl::PointXYZI>());
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());
	SUSAN.setInputCloud(cloud);
	SUSAN.setSearchMethod(tree);
	SUSAN.setRadius(3.0f);                  // 设置正常估计和非最大抑制的半径
	SUSAN.setDistanceThreshold(0.01f);      // 设置距离阈值
	SUSAN.setAngularThreshold(0.01f);       // 设置用于角点检测的角度阈值
	SUSAN.setIntensityThreshold(0.1f);      // 设置用于角点检测的强度阈值
	SUSAN.setNonMaxSupression(true);        // 对响应应用非最大值抑制,以保持最强角。
	SUSAN.compute(*keypoint1);
	pcl::copyPointCloud(*keypoint1, *keypoint);
}
pcl::PointCloud<pcl::FPFHSignature33>::Ptr compute_fpfh_feature(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr& keypoint)
{
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices());
	int i = 0;
	for (auto p : cloud->points)
	{
		for (auto k : keypoint->points)
		{
			if (k.x == p.x && k.y == p.y && k.z == p.z)
			{
				inliers->indices.push_back(i);
			}
		}
		i++;
	}
	n.setInputCloud(cloud);
	n.setSearchMethod(tree);
	n.setKSearch(10);
	n.compute(*normals);
	pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfh(new pcl::PointCloud<pcl::FPFHSignature33>);
	pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;
	f.setIndices(inliers);
	f.setNumberOfThreads(8);
	f.setInputCloud(cloud);
	f.setInputNormals(normals);
	f.setSearchMethod(tree);
	f.setRadiusSearch(50);
	f.compute(*fpfh);

	return fpfh;
}
pcl::PointCloud<pcl::PointXYZ>::Ptr sac_align(pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr s_k, pcl::PointCloud<pcl::PointXYZ>::Ptr t_k, pcl::PointCloud<pcl::FPFHSignature33>::Ptr sk_fpfh, pcl::PointCloud<pcl::FPFHSignature33>::Ptr tk_fpfh)
{
	pcl::SampleConsensusInitialAlignment<pcl::PointXYZ, pcl::PointXYZ, pcl::FPFHSignature33> scia;
	scia.setInputSource(s_k);
	scia.setInputTarget(t_k);
	scia.setSourceFeatures(sk_fpfh);
	scia.setTargetFeatures(tk_fpfh);
	scia.setMinSampleDistance(7);///参数:设置采样点之间的最小距离,满足的被当做采样点
	scia.setNumberOfSamples(100);设置每次迭代设置采样点的个数(这个参数多可以增加配准精度)
	scia.setCorrespondenceRandomness(6);//设置选择随机特征对应点时要使用的邻域点个数。值越大,特征匹配的随机性就越大
	pcl::PointCloud<pcl::PointXYZ>::Ptr sac_result(new pcl::PointCloud<pcl::PointXYZ>);
	scia.align(*sac_result);
	pcl::transformPointCloud(*cloud, *sac_result, scia.getFinalTransformation());
	return sac_result;
}

int main(int, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);//要配准变化的点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_target(new pcl::PointCloud<pcl::PointXYZ>);//目标点云(不变的)
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view1.pcd", *cloud) == -1)
	{
		PCL_ERROR("加载点云失败\n");
	}
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view2.pcd", *cloud_target) == -1)
	{
		PCL_ERROR("加载点云失败\n");
	}
	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer1(new pcl::visualization::PCLVisualizer("v1"));
	viewer1->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
	// 对目标点云着色可视化 (red).
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color1(cloud_target, 255, 0, 0);
	viewer1->setWindowName("SUSAN");
	viewer1->addPointCloud<pcl::PointXYZ>(cloud_target, target_color1, "target cloud");
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "target cloud");
	// 对源点云着色可视化 (green).
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color1(cloud, 0, 255, 0);
	viewer1->addPointCloud<pcl::PointXYZ>(cloud, input_color1, "input cloud");
	viewer1->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "input cloud");
	while (!viewer1->wasStopped())
	{
		viewer1->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}
	//粗配准
	pcl::PointCloud<pcl::PointXYZ>::Ptr s_k(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr t_k(new pcl::PointCloud<pcl::PointXYZ>);
	extract_keypoint(cloud, s_k);
	extract_keypoint(cloud_target, t_k);
	pcl::PointCloud<pcl::FPFHSignature33>::Ptr sk_fpfh = compute_fpfh_feature(cloud, s_k);
	pcl::PointCloud<pcl::FPFHSignature33>::Ptr tk_fpfh = compute_fpfh_feature(cloud_target, t_k);
	pcl::PointCloud<pcl::PointXYZ>::Ptr result(new pcl::PointCloud<pcl::PointXYZ>);
	result = sac_align(cloud, s_k, t_k, sk_fpfh, tk_fpfh);



	boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer2(new pcl::visualization::PCLVisualizer("v2"));
	viewer2->setBackgroundColor(0, 0, 0);  //设置背景颜色为黑色
	// 对目标点云着色可视化 (red).
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color2(cloud_target, 255, 0, 0);
	viewer2->setWindowName("SUSAN");
	viewer2->addPointCloud<pcl::PointXYZ>(cloud_target, target_color2, "target cloud");
	viewer2->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "target cloud");
	// 对源点云着色可视化 (green).
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color2(result, 0, 255, 0);
	viewer2->addPointCloud<pcl::PointXYZ>(result, input_color2, "input cloud");
	viewer2->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "input cloud");
	while (!viewer2->wasStopped())
	{
		viewer2->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100));
	}


	return 0;
}


关键代码解析:

我之前在iss关键点检测以及SAC-IA粗配准-CSDN博客

和本章第一部分已经解释了大部分函数,这里就不赘述了

结果:

输入点云与输出点云

配准后的输入点云与输出点云,实际效果相对较好,很快就能出结果   

注意:运行的时候用visual studio的Release模式,Debug模式会报错,除非去掉     SUSAN.setNonMaxSupression(true); 才能在Debug运行,但是配准速度会非常慢。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[]人的成功离不开气运这么一说!

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

代码随想录刷题笔记-Day17

1. 路径总和 112. 路径总和https://leetcode.cn/problems/path-sum/ 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true …

【分享】JLINK的SW调试模式连线方式

大家知道&#xff0c;JLINK有2种调试模式&#xff1a;JTAG和SWD&#xff08;串行模式&#xff09;。 JTAG是常用模式&#xff0c;大家都熟悉、不废话了&#xff1b;如果使用SW模式&#xff0c;需要&#xff08;只需要&#xff09;4根连线&#xff0c;连接方式如下&#xff1a; …

如何恢复未保存/删除的Word文档?- 2024年终极指南

很少有像丢失 Word 文档这样普遍熟悉的经历。从读过《麦田里的守望者》一书的高中生&#xff0c;到负责公布季度收益的企业高管&#xff0c;每个人都知道&#xff0c;当他们的工作距离完成只有几个十字路口时&#xff0c;他们的工作就消失了&#xff0c;这让他们感到恐慌。 如何…

Ubuntu Desktop 显示文件路径

Ubuntu Desktop 显示文件路径 1. GUI hot key2. CLIReferences 1. GUI hot key Ctrl L: 显示文件路径 2. CLI right click -> Open in Terminal -> pwd strongforeverstrong:~/Desktop$ pwd /home/strong/DesktopReferences [1] Yongqiang Cheng, https://yongqiang…

阿里云BGP多线精品EIP香港CN2线路低时延,价格贵

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

如何简单上手清华AutoGPT并搭建到本地环境

一、准备工作 安装Docker&#xff1a;确保你的本地机器上已经安装了Docker。如果还没有安装&#xff0c;请访问Docker官方网站并按照指引进行安装。--点击进入Docker官网 获取清华AutoGPT的Docker镜像&#xff1a;清华AutoGPT团队可能已经提供了一个Docker镜像&#xff0c;方便…

[word] word 2010宏已被禁用警告关闭方法 #媒体#学习方法

word 2010宏已被禁用警告关闭方法 Word2010宏已被禁用警告关闭方法&#xff1a;在「信任中心设置」选项的宏设置中选择「禁用所有宏&#xff0c;并且不通知」即可。 每次打开Word 2010&#xff0c;都会提示「完全警告&#xff1a;宏已被禁用」提示。自从Word 2010安装完毕&am…

线性注意力机制全新升级!性能显著提高,速度、精度更优

线性注意力机制通过对传统注意力机制中的Softmax操作进行线性化处理&#xff0c;可以提高Transformer模型的并行性能、降低复杂度&#xff0c;在计算效率、模型表达能力等方面都具有优势。 作为一种常用有效的优化方法&#xff0c;线性注意力机制可以在保证模型性能的同时提高…

【开源】SpringBoot框架开发学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

机器学习分类评估四个术语TP,FP,FN,TN

分类评估方法主要功能是用来评估分类算法的好坏&#xff0c;而评估一个分类器算法的好坏又包括许多项指标。了解各种评估方法&#xff0c;在实际应用中选择正确的评估方法是十分重要的。 这里首先介绍几个常见的模型评价术语&#xff0c;现在假设我们的分类目标只有两类&#x…

基于边缘计算的智能家居能源管理系统

一、项目背景 随着智能家居设备的普及&#xff0c;能源消耗问题日益凸显。为了更有效地管理家庭能源使用&#xff0c;减少浪费&#xff0c;并可能实现能源自给自足&#xff0c;我们提出了基于边缘计算的智能家居能源管理系统 该系统能够实时监控和分析家庭能源消耗数据&#xf…

红队学习笔记Day5 --->总结

今天先不讲新知识&#xff0c;来小小的复习一下 1.8888&#xff1f;隧道端口你怎么回事 在做隧道和端口转发的时候&#xff0c;我们常见的是通过一台跳板机&#xff0c;让外网的机器去远程连接到内网的一些机器&#xff0c;这时候就常见一些这样的命令 以防忘了&#xff0c;先…

【Linux】管道文件 打包压缩 文本编辑器nano 进度条

目录 什么是管道文件&#xff1f; 打包和压缩 文本编辑器 nano的安装 nano的使用 退出nano编辑&#xff0c;ctrlx 普通用户无法sudo&#xff0c;该怎么解决 Linux小程序-进度条 预备知识 1.回车换行 2.缓冲区 准备工作 代码实现 1.processBar.h代码编写 2.main.c代…

文案馆头像壁纸微信小程序源码【支持流量主】

文案馆头像壁纸微信小程序源码【支持流量主】 源码介绍&#xff1a;文案馆头像壁纸微信小程序源码是一款可以获取套图、头像、壁纸的小程序。小程序源码内置流量主功能 需求环境&#xff1a;微信小程序phpmysql 下载地址&#xff1a; https://www.changyouzuhao.cn/13453.ht…

docker (五)-docker存储-数据持久化

将数据存储在容器中&#xff0c;一旦容器被删除&#xff0c;数据也会被删除。同时也会使容器变得越来越大&#xff0c;不方便恢复和迁移。 将数据存储到容器之外&#xff0c;这样删除容器也不会丢失数据。一旦容器故障&#xff0c;我们可以重新创建一个容器&#xff0c;将数据挂…

【2024】如何订阅Netflix奈飞?Netflix奈飞购买教程

【2024】如何订阅Netflix奈飞&#xff1f;Netflix奈飞购买教程 Netflix奈飞作为全球领先的在线流媒体平台之一&#xff0c;拥有丰富的影视资源和独家内容&#xff0c;成为了人们追剧的热门选择。本文将为您介绍如何订阅Netflix奈飞&#xff0c;并提供详细的购买教程&#xff0…

redis高级篇

为什么用单线程 开始多线程和io复用 linux连接redis其实就是一个socket过程 bigkey记录案例和生产故障 插入100w数据 不使用key*那使用什么&#xff1f;&#xff1a;scan bigkey发现删除优化策略

【天衍系列 04】深入理解Flink的ElasticsearchSink组件:实时数据流如何无缝地流向Elasticsearch

文章目录 01 Elasticsearch Sink 基础概念02 Elasticsearch Sink 工作原理03 Elasticsearch Sink 核心组件04 Elasticsearch Sink 配置参数05 Elasticsearch Sink 依赖管理06 Elasticsearch Sink 初阶实战07 Elasticsearch Sink 进阶实战7.1 包结构 & 项目配置项目配置appl…

JVM-JVM中对象的结构

对象内存布局 对象里的三个区&#xff1a; 对象头&#xff08;Header&#xff09;&#xff1a;Java对象头占8byte。如果是数组则占12byte。因为JVM里数组size需要使用4byte存储。 标记字段MarkWord&#xff1a; 用于存储对象自身的运行时数据&#xff0c;它是synchronized实现轻…