FPFH特征描述符、对应关系可视化以及ICP配准

一、FPFH特征描述符可视化

C++

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/search/kdtree.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d_omp.h>//使用OMP需要添加的头文件
#include <boost/thread/thread.hpp>
#include <pcl/features/3dsc.h>
#include <pcl/visualization/pcl_plotter.h>// 直方图的可视化 
#include <pcl/visualization/histogram_visualizer.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/fpfh_omp.h>
using namespace std;
int main()
{//------------------加载点云数据-----------------pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view1.pcd", *cloud) == -1)//需使用绝对路径{PCL_ERROR("Could not read file\n");}//--------------------计算法线------------------pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;//OMP加速pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//建立kdtree来进行近邻点集搜索pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);n.setNumberOfThreads(8);//设置openMP的线程数n.setInputCloud(cloud);n.setSearchMethod(tree);n.setKSearch(20);n.compute(*normals);//开始进行法向计算// ------------------FPFH图像计算------------------pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfh_images(new pcl::PointCloud<pcl::FPFHSignature33>());f.setNumberOfThreads(12);f.setInputCloud(cloud);f.setInputNormals(normals);f.setSearchMethod(tree);f.setKSearch(30);f.compute(*fpfh_images);cout << "FPFH图像计算计算完成" << endl;// 显示和检索第一点的自旋图像描述符向量。pcl::FPFHSignature33 first_descriptor = fpfh_images->points[0];cout << first_descriptor << endl;pcl::visualization::PCLPlotter plotter;plotter.addFeatureHistogram(*fpfh_images, 200); //设置的横坐标长度,该值越大,则显示的越细致plotter.setWindowName("FPFH Image");plotter.plot();return 0;
}

关键代码解析:

    pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfh_images(new pcl::PointCloud<pcl::FPFHSignature33>());f.setNumberOfThreads(12);f.setInputCloud(cloud);f.setInputNormals(normals);f.setSearchMethod(tree);f.setKSearch(30);f.compute(*fpfh_images);cout << "FPFH图像计算计算完成" << endl;// 显示和检索第一点的自旋图像描述符向量。pcl::FPFHSignature33 first_descriptor = fpfh_images->points[0];cout << first_descriptor << endl;pcl::visualization::PCLPlotter plotter;plotter.addFeatureHistogram(*fpfh_images, 200); //设置的横坐标长度,该值越大,则显示的越细致plotter.setWindowName("FPFH Image");plotter.plot();

 

  1. pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;

    • 这一行定义了一个FPFH特征估计器对象f,使用了OMP(Open Multi-Processing)进行多线程计算。指定了输入点云类型为pcl::PointXYZ,输入法向量类型为pcl::Normal,以及输出特征类型为pcl::FPFHSignature33
  2. pcl::PointCloud<pcl::FPFHSignature33>::Ptr fpfh_images(new pcl::PointCloud<pcl::FPFHSignature33>());

    • 创建一个指向pcl::PointCloud<pcl::FPFHSignature33>类型的智能指针fpfh_images,用于存储计算得到的FPFH特征。
  3. f.setNumberOfThreads(12);

    • 设置用于计算FPFH特征的线程数。这里设置为12,以充分利用多核处理器的性能。线程数的选择应该考虑到计算机的硬件配置,过多的线程可能导致性能下降。
  4. f.setInputCloud(cloud);

    • 将点云数据设置为FPFH估计器的输入。cloud是一个指向pcl::PointCloud<pcl::PointXYZ>类型的指针,表示原始点云数据。
  5. f.setInputNormals(normals);

    • 将法向量数据设置为FPFH估计器的输入。normals是一个指向pcl::PointCloud<pcl::Normal>类型的指针,表示点云中每个点的法向量数据。
  6. f.setSearchMethod(tree);

    • 设置搜索方法。tree是一个用于加速邻域搜索的数据结构,例如kd-tree或octree。这个参数可以根据点云的大小和分布来调整,以获得更好的性能。
  7. f.setKSearch(30);

    • 设置用于计算FPFH特征的近邻点数目。这个参数影响着计算的邻域大小,值越大则考虑的邻域越大,特征描述更全局。
  8. f.compute(*fpfh_images);

    • 运行FPFH特征的计算过程。该方法会根据输入的点云和法向量数据以及设置的搜索参数来计算每个点的FPFH特征,并将结果存储在fpfh_images中。
  9. cout << "FPFH图像计算计算完成" << endl;

    • 打印消息,指示FPFH特征计算完成。
  10. pcl::FPFHSignature33 first_descriptor = fpfh_images->points[0];

    • 提取第一个点的FPFH特征描述符。这里假设点云中至少有一个点。
  11. cout << first_descriptor << endl;

    • 打印第一个点的FPFH特征描述符。
  12. pcl::visualization::PCLPlotter plotter;

    • 创建一个PCL绘图器对象,用于可视化FPFH特征。
  13. plotter.addFeatureHistogram(*fpfh_images, 200);

    • 向绘图器中添加FPFH特征的直方图。第二个参数指定了横坐标的长度,该值越大,显示的越细致。
  14. plotter.setWindowName("FPFH Image");

    • 设置绘图窗口的名称。
  15. plotter.plot();

    • 显示绘图器中的图像。

总的来说,这段代码的作用是计算并可视化点云的FPFH特征。参数的设置会直接影响特征的计算和可视化效果,因此需要根据具体的数据和需求进行调整。

结果:

二、FPFH对应关系可视化

C++

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/fpfh_omp.h>
#include <pcl/registration/correspondence_estimation.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/registration/transformation_estimation_svd.h> typedef pcl::PointCloud<pcl::PointXYZ> pointcloud;
typedef pcl::PointCloud<pcl::Normal> pointnormal;
typedef pcl::PointCloud<pcl::FPFHSignature33> fpfhFeature;fpfhFeature::Ptr compute_fpfh_feature(pointcloud::Ptr input_cloud, pcl::search::KdTree<pcl::PointXYZ>::Ptr tree)
{pointnormal::Ptr normals(new pointnormal);pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> n;n.setInputCloud(input_cloud);n.setNumberOfThreads(12);n.setSearchMethod(tree);n.setKSearch(20);n.compute(*normals);fpfhFeature::Ptr fpfh(new fpfhFeature);pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;f.setNumberOfThreads(12);f.setInputCloud(input_cloud);f.setInputNormals(normals);f.setSearchMethod(tree);f.setKSearch(30);f.compute(*fpfh);return fpfh;
}int main(int argc, char** argv)
{pointcloud::Ptr source_cloud(new pointcloud);pointcloud::Ptr target_cloud(new pointcloud);pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view1.pcd", *source_cloud);pcl::io::loadPCDFile<pcl::PointXYZ>("pcd/pig_view2.pcd", *target_cloud);pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());fpfhFeature::Ptr source_fpfh = compute_fpfh_feature(source_cloud, tree);fpfhFeature::Ptr target_fpfh = compute_fpfh_feature(target_cloud, tree);pcl::registration::CorrespondenceEstimation<pcl::FPFHSignature33, pcl::FPFHSignature33> crude_cor_est;boost::shared_ptr<pcl::Correspondences> cru_correspondences(new pcl::Correspondences);crude_cor_est.setInputSource(source_fpfh);crude_cor_est.setInputTarget(target_fpfh);crude_cor_est.determineCorrespondences(*cru_correspondences, 0.4);Eigen::Matrix4f Transform = Eigen::Matrix4f::Identity();pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>::Ptr trans(new pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>);trans->estimateRigidTransformation(*source_cloud, *target_cloud, *cru_correspondences, Transform);cout << "变换矩阵为:\n" << Transform << endl;boost::shared_ptr<pcl::visualization::PCLVisualizer>viewer(new pcl::visualization::PCLVisualizer("v"));viewer->setBackgroundColor(0, 0, 0);// 对目标点云着色可视化 (red).pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>target_color(target_cloud, 255, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(target_cloud, target_color, "target cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "target cloud");// 对源点云着色可视化 (green).pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>input_color(source_cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(source_cloud, input_color, "input cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "input cloud");//对应关系可视化viewer->addCorrespondences<pcl::PointXYZ>(source_cloud, target_cloud, *cru_correspondences, "correspondence");//viewer->initCameraParameters();while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}return 0;
}

关键代码解析:

    pcl::registration::CorrespondenceEstimation<pcl::FPFHSignature33, pcl::FPFHSignature33> crude_cor_est;boost::shared_ptr<pcl::Correspondences> cru_correspondences(new pcl::Correspondences);crude_cor_est.setInputSource(source_fpfh);crude_cor_est.setInputTarget(target_fpfh);crude_cor_est.determineCorrespondences(*cru_correspondences, 0.4);Eigen::Matrix4f Transform = Eigen::Matrix4f::Identity();pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>::Ptr trans(new pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>);trans->estimateRigidTransformation(*source_cloud, *target_cloud, *cru_correspondences, Transform);
  1. pcl::registration::CorrespondenceEstimation<pcl::FPFHSignature33, pcl::FPFHSignature33> crude_cor_est;

    • 创建了一个用于估计FPFH特征之间对应关系的对象crude_cor_est。这个对象的类型是pcl::registration::CorrespondenceEstimation,它用于估计两个点云之间的对应关系。
  2. boost::shared_ptr<pcl::Correspondences> cru_correspondences(new pcl::Correspondences);

    • 创建了一个指向pcl::Correspondences类型的智能指针cru_correspondences,用于存储对应关系。
  3. crude_cor_est.setInputSource(source_fpfh);

    • 设置源点云的FPFH特征作为对应关系估计的输入。source_fpfh是指向源点云的FPFH特征的指针。
  4. crude_cor_est.setInputTarget(target_fpfh);

    • 设置目标点云的FPFH特征作为对应关系估计的目标。target_fpfh是指向目标点云的FPFH特征的指针。
  5. crude_cor_est.determineCorrespondences(*cru_correspondences, 0.4);

    • 使用设定的FPFH特征对两个点云之间的对应关系进行估计。第二个参数0.4是一个阈值,用于控制匹配的严格度。更高的值会导致更宽松的匹配。
  6. Eigen::Matrix4f Transform = Eigen::Matrix4f::Identity();

    • 创建一个4x4的单位矩阵,用于存储刚性变换。
  7. pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>::Ptr trans(new pcl::registration::TransformationEstimationSVD<pcl::PointXYZ, pcl::PointXYZ, float>);

    • 创建了一个用于估计刚性变换的对象trans。这里使用了SVD(奇异值分解)方法进行刚性变换的估计。
  8. trans->estimateRigidTransformation(*source_cloud, *target_cloud, *cru_correspondences, Transform);

    • 使用对应关系和源点云以及目标点云之间的FPFH特征,估计两个点云之间的刚性变换。这个变换会被存储在Transform中。

参数的设置会影响配准的结果。例如,对应关系估计的阈值会影响匹配的严格度,而刚性变换的估计方法则会影响配准的准确度和鲁棒性。需要根据具体的应用场景和数据特点来选择合适的参数值

结果:

三、3DSC结合ICP配准  

C++

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/spin_image.h>
#include <pcl/registration/icp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <pcl/keypoints/iss_3d.h>
#include <pcl/registration/ia_ransac.h>
#include <pcl/visualization/pcl_plotter.h>
#include <pcl/features/fpfh_omp.h>
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;
typedef pcl::FPFHSignature33 FPFHT;
typedef pcl::PointCloud<FPFHT> PointCloudfpfh;
typedef pcl::search::KdTree<PointT> Tree;// 关键点提取
void extract_keypoint(PointCloud::Ptr& cloud, PointCloud::Ptr& keypoint, Tree::Ptr& tree)
{pcl::ISSKeypoint3D<PointT, PointT> iss;iss.setInputCloud(cloud);iss.setSearchMethod(tree);iss.setNumberOfThreads(8);     //初始化调度器并设置要使用的线程数iss.setSalientRadius(5);  // 设置用于计算协方差矩阵的球邻域半径iss.setNonMaxRadius(5);   // 设置非极大值抑制应用算法的半径iss.setThreshold21(0.95);     // 设定第二个和第一个特征值之比的上限iss.setThreshold32(0.95);     // 设定第三个和第二个特征值之比的上限iss.setMinNeighbors(6);       // 在应用非极大值抑制算法时,设置必须找到的最小邻居数iss.compute(*keypoint);
}
// 法线计算和 计算特征点的Spinimage描述子
void computeKeyPointsFPFH(PointCloud::Ptr& cloud_in, PointCloud::Ptr& key_cloud, PointCloudfpfh::Ptr& dsc, Tree::Ptr& tree)
{pcl::NormalEstimationOMP<PointT, pcl::Normal> n;//OMP加速pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);n.setNumberOfThreads(6);//设置openMP的线程数n.setInputCloud(key_cloud);n.setSearchSurface(cloud_in);n.setSearchMethod(tree);//n.setKSearch(10);n.setRadiusSearch(0.3);n.compute(*normals);pcl::FPFHEstimationOMP<pcl::PointXYZ, pcl::Normal, pcl::FPFHSignature33> f;f.setNumberOfThreads(12);f.setInputCloud(key_cloud);f.setInputNormals(normals);f.setSearchMethod(tree);f.setKSearch(30);f.compute(*dsc);}// 点云可视化
void visualize_pcd(PointCloud::Ptr icp_result, PointCloud::Ptr cloud_target)
{//创建初始化目标pcl::visualization::PCLVisualizer viewer("registration Viewer");pcl::visualization::PointCloudColorHandlerCustom<PointT> final_h(icp_result, 0, 255, 0);pcl::visualization::PointCloudColorHandlerCustom<PointT> tgt_h(cloud_target, 255, 0, 0);viewer.setBackgroundColor(0, 0, 0);viewer.addPointCloud(cloud_target, tgt_h, "tgt cloud");viewer.addPointCloud(icp_result, final_h, "final cloud");while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}
}int main()
{// 加载源点云和目标点云PointCloud::Ptr cloud(new PointCloud);PointCloud::Ptr cloud_target(new PointCloud);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");}visualize_pcd(cloud, cloud_target);//关键点pcl::PointCloud<PointT>::Ptr keypoints1(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<PointT>::Ptr keypoints2(new pcl::PointCloud<pcl::PointXYZ>);Tree::Ptr tree(new Tree);extract_keypoint(cloud, keypoints1, tree);extract_keypoint(cloud_target, keypoints2, tree);cout << "iss完成!" << endl;cout << "cloud的关键点的个数:" << keypoints1->size() << endl;cout << "cloud_target的关键点的个数:" << keypoints2->size() << endl;// 使用SpinImage描述符计算特征PointCloudfpfh::Ptr source_features(new PointCloudfpfh);PointCloudfpfh::Ptr target_features(new PointCloudfpfh);computeKeyPointsFPFH(cloud, keypoints1, source_features, tree);computeKeyPointsFPFH(cloud_target, keypoints2, target_features, tree);cout << "FPFH完成!" << endl;//SAC配准pcl::SampleConsensusInitialAlignment<PointT, PointT, FPFHT> scia;scia.setInputSource(keypoints1);scia.setInputTarget(keypoints2);scia.setSourceFeatures(source_features);scia.setTargetFeatures(target_features);scia.setMinSampleDistance(7);     // 设置样本之间的最小距离scia.setNumberOfSamples(100);       // 设置每次迭代计算中使用的样本数量(可省),可节省时间scia.setCorrespondenceRandomness(6);// 在选择随机特征对应时,设置要使用的邻居的数量;PointCloud::Ptr sac_result(new PointCloud);scia.align(*sac_result);Eigen::Matrix4f sac_trans;sac_trans = scia.getFinalTransformation();cout << "SAC配准完成!" << endl;//icp配准PointCloud::Ptr icp_result(new PointCloud);pcl::IterativeClosestPoint<PointT, PointT> icp;icp.setInputSource(keypoints1);icp.setInputTarget(keypoints2);icp.setMaxCorrespondenceDistance(20);icp.setMaximumIterations(35);        // 最大迭代次数icp.setTransformationEpsilon(1e-10); // 两次变化矩阵之间的差值icp.setEuclideanFitnessEpsilon(0.01);// 均方误差icp.align(*icp_result, sac_trans);cout << "ICP配准完成!" << endl;// 输出配准结果std::cout << "ICP converged: " << icp.hasConverged() << std::endl;std::cout << "Transformation matrix:\n" << icp.getFinalTransformation() << std::endl;Eigen::Matrix4f icp_trans;icp_trans = icp.getFinalTransformation();cout << icp_trans << endl;使用创建的变换对未过滤的输入点云进行变换pcl::transformPointCloud(*cloud, *icp_result, icp_trans);visualize_pcd(icp_result, cloud_target);return 0;
}

关键代码解析:

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

和Spin Image自旋图像描述符可视化以及ICP配准-CSDN博客以及本章第一部分已经解释了大部分函数,这里就不赘述了

结果:

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

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

相关文章

批量追踪中通快递

在物流信息的管理中&#xff0c;批量追踪中通快递单号一直是个让人头疼的问题。但有了固乔快递查询助手&#xff0c;这一切都变得轻而易举。 固乔快递查询助手&#xff0c;作为市场上备受好评的快递查询软件&#xff0c;专门针对批量查询需求进行了优化。用户只需将中通快递单号…

【Linux】简单的网络计算器的实现(自定义协议,序列化,反序列化)

文章目录 前言一、 服务端1.ServerCal.cc&#xff08;服务器主文件&#xff09;2.ServerCal.hpp3.Sock.hpp(套接字封装)4.TcpServer.hpp(服务器)5.Protocol&#xff08;自定义协议&#xff09; 二、用户端1.ClientCal 三、Log.hpp&#xff08;日志&#xff09;四、makefile 前言…

【Qt学习】QIcon类 + 利用qrc机制设置图片路径(QtCreator)

文章目录 1. QIcon / windowIcon2. setIcon() 与 setwindowIcon()2.1 setIcon() 介绍与使用2.2 setWindowIcon 介绍与使用 3. 路径问题 & qrc机制的引入3.1 绝对路径 / 相对路径 的问题3.2 qrc机制3.3 在QtCreator下利用qrc机制引入图片 1. QIcon / windowIcon QIcon QIco…

单输入Doherty 功率放大器的极限带宽分析(含Matlab分析代码)

单输入Doherty 功率放大器的极限带宽分析&#xff08;含Matlab分析代码&#xff09; 参考论文&#xff1a;高效连续型射频功率放大器研究 DPA的基础理论参考&#xff1a;理想架构的Doherty功率放大器理论与仿真 1、单输入Doherty 功率放大器架构 假设 Doherty 功率放大器的…

介绍7款免费的最佳地图/导航/定位/GIS开源项目

文章目录 1、xdh-map新德汇地图应用类库1.1、独立引用1.2、与MyUI结合使用1.3、快速上手1.3.1、采用项目工程模板创建项目【推荐】1.3.2、 调用组件库功能 2、蚂蚁金服AntV-L7地理空间数据可视分析引擎2.1、AntV-L7简介2.2、核心特性2.3、支持丰富的图表类型2.4、如何使用2.4.1…

反转一个单链表

反转一个单链表 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 需要虚拟节点么&#xff1f; 答&#xff1a;不需要&#xff0c;因为没有删除节点&#xff0c;只是改变了节点的指向。 遍…

计算机设计大赛 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

Rust-知多少?

文章目录 前言1.使用下划线开头忽略未使用的变量2. 变量解构3.常量4.变量遮蔽&#xff08;shadowing&#xff09;5. 类似println!("{}", x); 为啥加感叹号6.单元类型总结 前言 Rust 学习系列&#xff0c;记录一些rust使用小技巧 1.使用下划线开头忽略未使用的变量 …

MySQL跨服务器关联查询

1. 首先确认服务器的Federated引擎是否开启 show engines;修改数据库的配制文件my.ini,(我的my.ini的路径为&#xff1a;D:\ProgramData\MySQL\MySQL Server 5.7/my.ini),将federated添加到my.ini文件中 到MySQL的my.cnf配置文件中修改 在 [mysqld] 下方加入 federated 然后重…

通过前序和中序遍历结果构造二叉树

题目 105. 从前序与中序遍历序列构造二叉树 - 力扣&#xff08;LeetCode&#xff09; 思路 首先思考&#xff0c;根节点应该做什么。 肯定要想办法确定根节点的值&#xff0c;把根节点做出来&#xff0c;然后递归构造左右子树即可。 我们先来回顾一下&#xff0c;前序遍历和…

全网超全的测试类型详解,再也不怕面试答不出来了!

在软件测试工作过程中或者在面试过程中经常会被问到一些看起来简单但是总是有些回答不上的问题&#xff0c;比如你说说“黑盒测试和白盒测试的区别&#xff1f;”&#xff0c;“你们公司做灰度测试么&#xff1f;", ”α测试和β测试有什么不一样&#xff1f;“&#xff0…

review 10

整理磁盘操作的完整流程&#xff0c;如何接入虚拟机&#xff0c;是否成功识别&#xff0c;对磁盘分区工具的使用&#xff0c;格式化&#xff0c;挂载以及取消挂载、复习cp、mv和find指令 1&#xff1a;U盘接入虚拟机 在弹出窗口直接选择 虚拟机-可移动设备-找到u盘-连接 2&a…

matlab代码--基于注水法的MIMO信道容量实现

今天接触一个简单的注水法程序&#xff0c;搞懂数学原理即可看懂代码。 1 注水法简介 详细原理可以参考&#xff1a; MIMO的信道容量以及实现 大致理论就是利用拉格朗日乘子法&#xff0c;求解信道容量的最大化问题&#xff0c;得到的解形如往水池中注水的形式&#xff0c;最…

过字符设备驱动分步注册过程实现LED驱动的编写,编写应用程序测试,发布到CSDN

头文件 #ifndef __HEAD_H__ #define __HEAD_H__ typedef struct{unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t; #define PHY_LED1_ADDR 0X50006000 #define PHY_LED2_ADDR 0X50007000 #d…

信号系统之移动平均滤波器

1 通过卷积实现 移动平均滤波器的工作原理是平均输入信号中的多个点&#xff0c;以产生输出信号中的每个点。在方程式形式中&#xff0c;这样写&#xff1a; 其中是 x 输入信号&#xff0c;y 是输出信号&#xff0c;M 是平均值中的点数。例如&#xff0c;在 5 点移动平均滤波器…

基于51单片机的智能台灯的设计与实现

摘 要:针对青少年因坐姿不正确、灯光亮度不合适、用眼过度等原因易导致的近视问题,文中提出使用51单片机作为主控制单元,选用红外检测、光敏检测、蓝牙通信、蜂鸣器和模数转换等模块,设计了一款智能台灯。该智能台灯具有节能、预防近视等功能。经测试,该台灯具有保护视力的…

php基础学习之常用系统函数

一&#xff0c;有关输出的语句/函数 echo语句 用于输出一个或多个字符串 print语句 用于输出一个字符串&#xff08;用句点连接的多个字符串本质是一个字符串&#xff09;&#xff0c;与echo类似&#xff0c;但返回值为1 printf()函数 用于格式化输出字符串&#xff0c;类似于C…

Android下SF合成流程重学习之Refresh流程

Android下SF合成流程重学习之Refresh流程 引言 在前面初步分析完成了Android下SF合成流程重学习之Invalidate流程&#xff0c;我们接下来继续下面的分析。当有事务的更新或者有Buffer的更新便会触发后面刷新的流程,即Refresh流程&#xff01; 一. onMessageRefresh 文件&…

QT串口通讯上位机_基础串口通讯

目录 1. 实现目标1.1 界面1.2 发送1.3 接收1.4 清除接收、发送 2. 新建工程3. 添加头文件4. 变量定义5. 完整代码6. 工程下载 1. 实现目标 1.1 界面 1.2 发送 1.3 接收 1.4 清除接收、发送 2. 新建工程 3. 添加头文件 QT serialport // #include <QDebug‘’> #incl…

数据库架构师之道:MySQL安装与系统整合指南

目录 MySQL数据库安装&#xff08;centos&#xff09; 版本选择 企业版 社区版 选哪个 MySQL特点 MySQL服务端-客户端 mysql下载选择 软件包解释 安装MySQL的方式 rpm包安装 yum方式安装 源码编译安装★ 具体的编译安装步骤★★ 环境准备 free -m命令 cat /pr…