点云统计滤波(基于中值距离)
‌效果对比:// ---------- 2. 参数设置 ---------- const float radius 0.1f; // 搜索半径米决定每个点的邻域大小。 // 调试技巧 // - 增大 radius 可在稀疏点云中找到更多邻居但会增加计算量并可能把不同结构的点混在一起。 // - 减小 radius 可提高局部精度适用于高密度点云或希望滤除远离点但会使某些边界点被视为孤立点。 // 建议范围0.05 ~ 1.0根据点云分辨率调整。 const int min_neighbors 100; // 最少邻居数执行统计/中位数计算所需的邻居数量阈值。 // 调试技巧 // - 增大 min_neighbors 会让稀疏点更容易被跳过有助于移除孤立噪声但可能丢失真实的稀疏结构点。 // - 减小 min_neighbors 会保留更多点但可能使噪声对统计结果产生更大影响。 // 建议范围10 ~ 200随点云密度增减。 const float multiplier 0.1f; // 阈值倍率用于判断点是否保留的阈值为 global_median * multiplier。 // 调试技巧 // - 减小 multiplier如 0.3~0.5会更严格地筛选点移除更多离群点/边缘噪声。 // - 增大 multiplier1.0会更宽松地保留点适用于需要保全更多细节的场景。 // 建议范围0.3 ~ 2.0。根据可视化结果反复微调。算法步骤‌对每个点搜索半径radius内的邻居点计算每个点的邻域距离中位数计算所有点中位数的全局中位数以global_median * multiplier为阈值筛选离群点#include iostream #include vector #include numeric #include algorithm #include cmath #include sstream #include pcl/io/ply_io.h #include pcl/io/pcd_io.h #include pcl/point_types.h #include pcl/search/kdtree.h // KD-Tree用于邻域搜索 #include pcl/features/normal_3d.h // 法线估计头文件 #include pcl/ModelCoefficients.h // 模型系数头文件 #include pcl/sample_consensus/ransac.h // RANSAC #include pcl/sample_consensus/method_types.h // 随机采样一致性方法 #include pcl/sample_consensus/model_types.h // 模型类型定义 #include pcl/segmentation/sac_segmentation.h // RANSAC 分割头文件 #include pcl/sample_consensus/sac_model_cylinder.h// 圆柱模型定义 #include pcl/filters/extract_indices.h #include pcl/console/print.h // 日志输出 #include stdexcept // 异常处理 #include boost/thread/thread.hpp #include boost/date_time/posix_time/posix_time.hpp #include pcl/visualization/pcl_visualizer.h // 可视化 #include pcl/common/common.h #include chrono #include thread #include pcl/io/ply_io.h #include pcl/filters/extract_indices.h std::string current_time() { auto now std::chrono::system_clock::now(); auto in_time_t std::chrono::system_clock::to_time_t(now); std::stringstream ss; ss std::put_time(std::localtime(in_time_t), %Y-%m-%d %H:%M:%S); return ss.str(); } int main(int argc, char** argv) { // ---------- 1. 读取点云 ---------- std::cout [ current_time() ] start load cloud file: inside.ply std::endl; pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPLYFilepcl::PointXYZ(inside.ply, *cloud) 0) { std::cerr [ current_time() ] ERROR: Failed to load point cloud file inside.ply. std::endl; return -1; } std::cout [ current_time() ] success load cloudPoint, Size: cloud-size() std::endl; if (cloud-empty()) { std::cerr [ current_time() ] ERROR: Point cloud is empty. std::endl; return -1; } // ---------- 2. 参数设置 ---------- const float radius 0.1f; // 搜索半径米决定每个点的邻域大小。 // 调试技巧 // - 增大 radius 可在稀疏点云中找到更多邻居但会增加计算量并可能把不同结构的点混在一起。 // - 减小 radius 可提高局部精度适用于高密度点云或希望滤除远离点但会使某些边界点被视为孤立点。 // 建议范围0.05 ~ 1.0根据点云分辨率调整。 const int min_neighbors 100; // 最少邻居数执行统计/中位数计算所需的邻居数量阈值。 // 调试技巧 // - 增大 min_neighbors 会让稀疏点更容易被跳过有助于移除孤立噪声但可能丢失真实的稀疏结构点。 // - 减小 min_neighbors 会保留更多点但可能使噪声对统计结果产生更大影响。 // 建议范围10 ~ 200随点云密度增减。 const float multiplier 0.1f; // 阈值倍率用于判断点是否保留的阈值为 global_median * multiplier。 // 调试技巧 // - 减小 multiplier如 0.3~0.5会更严格地筛选点移除更多离群点/边缘噪声。 // - 增大 multiplier1.0会更宽松地保留点适用于需要保全更多细节的场景。 // 建议范围0.3 ~ 2.0。根据可视化结果反复微调。 // ---------- 3. 构建 KD-Tree ---------- // 在范围查询如“半径为5米内的所有点”或光线追踪中划分空间可以快速跳过无用的区域 std::cout [ current_time() ] Building KD-Tree... std::endl; pcl::KdTreeFLANNpcl::PointXYZ kdtree; kdtree.setInputCloud(cloud); // ---------- 4. Compute median neighborhood distance ---------- std::cout [ current_time() ] Start computing median neighborhood distance... std::endl; std::vectorint nn_indices; std::vectorfloat nn_distances; std::vectorfloat median_distances; median_distances.reserve(cloud-size()); size_t skipped_points 0; for (size_t i 0; i cloud-size(); i) { if (!std::isfinite(cloud-at(i).x)) { median_distances.push_back(0.0f); skipped_points; continue; } //--------------对每个点搜索半径radius内的邻居点---------------- // nn_indices存储‌邻居点的索引‌列表 // nn_distances存储‌邻居点到目标点的距离‌列表 kdtree.radiusSearch(i, radius, nn_indices, nn_distances); if (nn_indices.size() static_castsize_t(min_neighbors)) { median_distances.push_back(0.0f); skipped_points; continue; } std::sort(nn_distances.begin(), nn_distances.end()); float median_dist nn_distances[nn_indices.size() / 2]; median_distances.push_back(median_dist); } std::cout [ current_time() ] Median distance computed, valid points: cloud-size() - skipped_points , skipped points: skipped_points std::endl; // ---------- 5. 计算全局中心距离 ---------- std::vectorfloat sorted_medians median_distances; std::sort(sorted_medians.begin(), sorted_medians.end()); float global_median sorted_medians[sorted_medians.size() / 2]; std::cout [ current_time() ] Global median distance: global_median std::endl; // ---------- 6. Select inliers ---------- pcl::PointIndices::Ptr inliers(new pcl::PointIndices); for (size_t i 0; i cloud-size(); i) { if (median_distances[i] global_median * multiplier) { //inliers-indices.push_back(i); } else { inliers-indices.push_back(i); } } std::cout [ current_time() ] Inlier count: inliers-indices.size() std::endl; // ---------- 7. Extract filtered result ---------- pcl::ExtractIndicespcl::PointXYZ extract; extract.setInputCloud(cloud); extract.setIndices(inliers); pcl::PointCloudpcl::PointXYZ::Ptr filtered_cloud(new pcl::PointCloudpcl::PointXYZ); extract.filter(*filtered_cloud); std::cout [ current_time() ] Filtering finished, original points: cloud-size() , filtered points: filtered_cloud-size() std::endl; // 8. Left-right split visualization std::cout [ current_time() ] Creating left-right comparison window... std::endl; // Print point-cloud bounds. auto print_bounds [](const pcl::PointCloudpcl::PointXYZ::Ptr pc, const char* name) { if (!pc) { std::cout name nullptr\n; return; } std::cout [ current_time() ] name size pc-size(); if (pc-empty()) { std::cout (empty)\n; return; } Eigen::Vector4f minPt, maxPt; pcl::getMinMax3D(*pc, minPt, maxPt); std::cout min( minPt[0] , minPt[1] , minPt[2] ) max( maxPt[0] , maxPt[1] , maxPt[2] )\n; }; print_bounds(cloud, original_cloud); print_bounds(filtered_cloud, filtered_cloud); // Create the visualizer window. boost::shared_ptrpcl::visualization::PCLVisualizer viewer(new pcl::visualization::PCLVisualizer(Point Cloud Filter Comparison - Left: Original | Right: Filtered)); viewer-initCameraParameters(); // Create left and right viewports. int v1, v2; viewer-createViewPort(0.0, 0.0, 0.5, 1.0, v1); // Left viewport viewer-createViewPort(0.5, 0.0, 1.0, 1.0, v2); // Right viewport // Use a dark background for better contrast. viewer-setBackgroundColor(0.05, 0.05, 0.05, v1); viewer-setBackgroundColor(0.05, 0.05, 0.05, v2); // Add a coordinate system. viewer-addCoordinateSystem(0.5); // Configure point-cloud colors. pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ original_h(cloud, 0, 200, 200); // Cyan pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ filtered_h(filtered_cloud, 255, 150, 0); // Orange // Add the point clouds to the viewports. if (cloud !cloud-empty()) { viewer-addPointCloud(cloud, original_h, original_cloud, v1); viewer-setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, original_cloud); viewer-addText(Original Cloud, 10, 10, v1_text, v1); } if (filtered_cloud !filtered_cloud-empty()) { viewer-addPointCloud(filtered_cloud, filtered_h, filtered_cloud, v2); viewer-setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, filtered_cloud); viewer-addText(Filtered Cloud, 10, 10, v2_text, v2); } // Reset the camera for a reasonable initial view. viewer-resetCamera(); // Enter the render loop. while (!viewer-wasStopped()) { viewer-spinOnce(50); boost::this_thread::sleep(boost::posix_time::milliseconds(10)); } std::cout [ current_time() ] Comparison window closed. Program finished. std::endl; return 0; }多线程优化#include iostream #include vector #include numeric #include algorithm #include cmath #include sstream #include pcl/io/ply_io.h #include pcl/io/pcd_io.h #include pcl/point_types.h #include pcl/search/kdtree.h // KD-Tree用于邻域搜索 #include pcl/features/normal_3d.h // 法线估计头文件 #include pcl/ModelCoefficients.h // 模型系数头文件 #include pcl/sample_consensus/ransac.h // RANSAC #include pcl/sample_consensus/method_types.h // 随机采样一致性方法 #include pcl/sample_consensus/model_types.h // 模型类型定义 #include pcl/segmentation/sac_segmentation.h // RANSAC 分割头文件 #include pcl/sample_consensus/sac_model_cylinder.h// 圆柱模型定义 #include pcl/filters/extract_indices.h #include pcl/console/print.h // 日志输出 #include stdexcept // 异常处理 #include boost/thread/thread.hpp #include boost/date_time/posix_time/posix_time.hpp #include pcl/visualization/pcl_visualizer.h // 可视化 #include pcl/common/common.h #include chrono #include thread #include atomic #include mutex #include pcl/io/ply_io.h #include pcl/filters/extract_indices.h std::string current_time() { auto now std::chrono::system_clock::now(); auto in_time_t std::chrono::system_clock::to_time_t(now); std::stringstream ss; ss std::put_time(std::localtime(in_time_t), %Y-%m-%d %H:%M:%S); return ss.str(); } int main(int argc, char** argv) { // ---------- 1. 读取点云 ---------- std::cout [ current_time() ] start load cloud file: inside.ply std::endl; pcl::PointCloudpcl::PointXYZ::Ptr cloud(new pcl::PointCloudpcl::PointXYZ); if (pcl::io::loadPLYFilepcl::PointXYZ(inside.ply, *cloud) 0) { std::cerr [ current_time() ] ERROR: Failed to load point cloud file inside.ply. std::endl; return -1; } std::cout [ current_time() ] success load cloudPoint, Size: cloud-size() std::endl; if (cloud-empty()) { std::cerr [ current_time() ] ERROR: Point cloud is empty. std::endl; return -1; } // ---------- 2. 参数设置 ---------- const float radius 0.1f; // 搜索半径米决定每个点的邻域大小。 // 调试技巧 // - 增大 radius 可在稀疏点云中找到更多邻居但会增加计算量并可能把不同结构的点混在一起。 // - 减小 radius 可提高局部精度适用于高密度点云或希望滤除远离点但会使某些边界点被视为孤立点。 // 建议范围0.05 ~ 1.0根据点云分辨率调整。 const int min_neighbors 100; // 最少邻居数执行统计/中位数计算所需的邻居数量阈值。 // 调试技巧 // - 增大 min_neighbors 会让稀疏点更容易被跳过有助于移除孤立噪声但可能丢失真实的稀疏结构点。 // - 减小 min_neighbors 会保留更多点但可能使噪声对统计结果产生更大影响。 // 建议范围10 ~ 200随点云密度增减。 const float multiplier 0.1f; // 阈值倍率用于判断点是否保留的阈值为 global_median * multiplier。 // 调试技巧 // - 减小 multiplier如 0.3~0.5会更严格地筛选点移除更多离群点/边缘噪声。 // - 增大 multiplier1.0会更宽松地保留点适用于需要保全更多细节的场景。 // 建议范围0.3 ~ 2.0。根据可视化结果反复微调。 // 可配置线程数 unsigned int kd_tree_instances std::thread::hardware_concurrency(); if (kd_tree_instances 0) kd_tree_instances 4; // fallback unsigned int median_threads std::thread::hardware_concurrency(); if (median_threads 0) median_threads 4; // fallback // ---------- 3. 构建 KD-Tree ---------- // 在范围查询如“半径为5米内的所有点”或光线追踪中划分空间可以快速跳过无用的区域 std::cout [ current_time() ] Building KD-Tree(s)... std::endl; auto t_kd_start std::chrono::high_resolution_clock::now(); // 构建多个 KD-Tree 实例供各线程复用避免在线程中重复构建或加锁访问单一实例 unsigned int num_kdtrees kd_tree_instances; std::vectorpcl::KdTreeFLANNpcl::PointXYZ kdtrees; kdtrees.resize(num_kdtrees); try { for (unsigned int k 0; k num_kdtrees; k) { kdtrees[k].setInputCloud(cloud); } } catch (const std::exception e) { std::cerr [ current_time() ] ERROR: KD-Tree build failed: e.what() std::endl; return -1; } catch (...) { std::cerr [ current_time() ] ERROR: KD-Tree build failed: unknown error std::endl; return -1; } auto t_kd_end std::chrono::high_resolution_clock::now(); auto kd_ms std::chrono::duration_caststd::chrono::milliseconds(t_kd_end - t_kd_start).count(); std::cout [ current_time() ] KD-Tree(s) built in kd_ms ms std::endl; std::cout [ current_time() ] KD-Tree instances(threads): num_kdtrees std::endl; // ---------- 4. Compute median neighborhood distance ---------- std::cout [ current_time() ] Start computing median neighborhood distance (multithreaded)... std::endl; std::vectorfloat median_distances; median_distances.resize(cloud-size(), 0.0f); std::atomic_size_t skipped_points_atomic{0}; std::atomic_bool processing_error{false}; std::string processing_error_msg; std::mutex processing_error_mutex; unsigned int num_threads median_threads; std::cout [ current_time() ] Using num_threads threads for median computation std::endl; auto t_med_start std::chrono::high_resolution_clock::now(); auto worker [](unsigned int thread_id, size_t start_idx, size_t end_idx) { try { // 每线程复用对应的 KD-Tree 实例避免重复构建预分配容器以减少内存分配开销 pcl::KdTreeFLANNpcl::PointXYZ local_kdtree kdtrees[thread_id % kdtrees.size()]; std::vectorint local_indices; std::vectorfloat local_distances; local_indices.reserve(min_neighbors * 2); local_distances.reserve(min_neighbors * 2); for (size_t i start_idx; i end_idx; i) { if (!std::isfinite(cloud-at(i).x)) { median_distances[i] 0.0f; skipped_points_atomic; continue; } local_indices.clear(); local_distances.clear(); local_kdtree.radiusSearch(i, radius, local_indices, local_distances); if (local_distances.size() static_castsize_t(min_neighbors)) { median_distances[i] 0.0f; skipped_points_atomic; continue; } size_t m local_distances.size() / 2; std::nth_element(local_distances.begin(), local_distances.begin() m, local_distances.end()); float median_dist local_distances[m]; median_distances[i] median_dist; } } catch (const std::exception e) { std::lock_guardstd::mutex lg(processing_error_mutex); processing_error_msg std::string(Worker thread exception: ) e.what(); processing_error true; } catch (...) { std::lock_guardstd::mutex lg(processing_error_mutex); processing_error_msg Worker thread unknown exception; processing_error true; } }; std::vectorstd::thread threads; threads.reserve(num_threads); size_t N cloud-size(); size_t chunk (N num_threads - 1) / num_threads; for (unsigned int t 0; t num_threads; t) { size_t start t * chunk; if (start N) break; size_t end std::min(N, start chunk); threads.emplace_back(worker, t, start, end); } for (auto th : threads) th.join(); // 如果线程中发生异常输出并安全退出不做可视化 if (processing_error) { std::lock_guardstd::mutex lg(processing_error_mutex); std::cerr [ current_time() ] ERROR: processing_error_msg std::endl; std::cerr [ current_time() ] Aborting processing due to worker thread error. std::endl; return -1; } auto t_med_end std::chrono::high_resolution_clock::now(); auto med_ms std::chrono::duration_caststd::chrono::milliseconds(t_med_end - t_med_start).count(); size_t skipped_points skipped_points_atomic.load(); std::cout [ current_time() ] Median distance computed (multithreaded) in med_ms ms, valid points: (cloud-size() - skipped_points) , skipped points: skipped_points std::endl; // ---------- 5. 计算全局中心距离只使用有效中值并使用 nth_element 加速 ---------- auto t_global_start std::chrono::high_resolution_clock::now(); std::vectorfloat valid_medians; valid_medians.reserve(cloud-size() - skipped_points); for (const auto m : median_distances) { if (m 0.0f) valid_medians.push_back(m); } float global_median 0.0f; if (valid_medians.empty()) { std::cerr [ current_time() ] WARNING: No valid median distances found, global median set to 0. std::endl; } else { size_t mid valid_medians.size() / 2; std::nth_element(valid_medians.begin(), valid_medians.begin() mid, valid_medians.end()); global_median valid_medians[mid]; } auto t_global_end std::chrono::high_resolution_clock::now(); auto global_ms std::chrono::duration_caststd::chrono::milliseconds(t_global_end - t_global_start).count(); std::cout [ current_time() ] Global median distance: global_median (computed in global_ms ms) std::endl; // ---------- 6. Select inliers ---------- auto t_select_start std::chrono::high_resolution_clock::now(); pcl::PointIndices::Ptr inliers(new pcl::PointIndices); inliers-indices.reserve(cloud-size() / 4); for (size_t i 0; i cloud-size(); i) { if (median_distances[i] global_median * multiplier) { // keep } else { inliers-indices.push_back(i); } } auto t_select_end std::chrono::high_resolution_clock::now(); auto select_ms std::chrono::duration_caststd::chrono::milliseconds(t_select_end - t_select_start).count(); std::cout [ current_time() ] Inlier count: inliers-indices.size() (selection in select_ms ms) std::endl; // ---------- 7. Extract filtered result ---------- pcl::ExtractIndicespcl::PointXYZ extract; extract.setInputCloud(cloud); extract.setIndices(inliers); pcl::PointCloudpcl::PointXYZ::Ptr filtered_cloud(new pcl::PointCloudpcl::PointXYZ); auto t_extract_start std::chrono::high_resolution_clock::now(); try { extract.filter(*filtered_cloud); } catch (const std::exception e) { std::cerr [ current_time() ] ERROR: extract.filter failed: e.what() std::endl; return -1; } catch (...) { std::cerr [ current_time() ] ERROR: extract.filter failed: unknown error std::endl; return -1; } auto t_extract_end std::chrono::high_resolution_clock::now(); auto extract_ms std::chrono::duration_caststd::chrono::milliseconds(t_extract_end - t_extract_start).count(); std::cout [ current_time() ] Filtering finished, original points: cloud-size() , filtered points: filtered_cloud-size() (extraction in extract_ms ms) std::endl; // 8. Left-right split visualization std::cout [ current_time() ] Creating left-right comparison window... std::endl; // Print point-cloud bounds. auto print_bounds [](const pcl::PointCloudpcl::PointXYZ::Ptr pc, const char* name) { if (!pc) { std::cout name nullptr\n; return; } std::cout [ current_time() ] name size pc-size(); if (pc-empty()) { std::cout (empty)\n; return; } Eigen::Vector4f minPt, maxPt; pcl::getMinMax3D(*pc, minPt, maxPt); std::cout min( minPt[0] , minPt[1] , minPt[2] ) max( maxPt[0] , maxPt[1] , maxPt[2] )\n; }; print_bounds(cloud, original_cloud); print_bounds(filtered_cloud, filtered_cloud); // Create the visualizer window. boost::shared_ptrpcl::visualization::PCLVisualizer viewer(new pcl::visualization::PCLVisualizer(Point Cloud Filter Comparison - Left: Original | Right: Filtered)); viewer-initCameraParameters(); // Create left and right viewports. int v1, v2; viewer-createViewPort(0.0, 0.0, 0.5, 1.0, v1); // Left viewport viewer-createViewPort(0.5, 0.0, 1.0, 1.0, v2); // Right viewport // Use a dark background for better contrast. viewer-setBackgroundColor(0.05, 0.05, 0.05, v1); viewer-setBackgroundColor(0.05, 0.05, 0.05, v2); // Add a coordinate system. viewer-addCoordinateSystem(0.5); // Configure point-cloud colors. pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ original_h(cloud, 0, 200, 200); // Cyan pcl::visualization::PointCloudColorHandlerCustompcl::PointXYZ filtered_h(filtered_cloud, 255, 150, 0); // Orange // Add the point clouds to the viewports. if (cloud !cloud-empty()) { viewer-addPointCloud(cloud, original_h, original_cloud, v1); viewer-setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, original_cloud); viewer-addText(Original Cloud, 10, 10, v1_text, v1); } if (filtered_cloud !filtered_cloud-empty()) { viewer-addPointCloud(filtered_cloud, filtered_h, filtered_cloud, v2); viewer-setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, filtered_cloud); viewer-addText(Filtered Cloud, 10, 10, v2_text, v2); } // Reset the camera for a reasonable initial view. viewer-resetCamera(); // Enter the render loop. while (!viewer-wasStopped()) { viewer-spinOnce(50); boost::this_thread::sleep(boost::posix_time::milliseconds(10)); } std::cout [ current_time() ] Comparison window closed. Program finished. std::endl; return 0; }

相关新闻

oneTBB Flow Graph 异步节点与 SYCL 协同异构计算实战:tbb-async-sycl 示例深度解析

oneTBB Flow Graph 异步节点与 SYCL 协同异构计算实战:tbb-async-sycl 示例深度解析

并发编程高性能计算 【免费下载链接】oneTBB oneAPI Threading Building Blocks (oneTBB) 项目地址: https://gitcode.com/gh_mirrors/on/oneTBB 点击查看 免费下载 导读 tbb-async-sycl 是 oneTBB(oneAPI Threading Building Blocks)官方示…

2026/10/10 4:39:17 阅读更多 →
四个直播平台装进一个屏幕,Simple Live 跨平台直播实测指南

四个直播平台装进一个屏幕,Simple Live 跨平台直播实测指南

四个直播平台装进一个屏幕,Simple Live 跨平台直播实测指南 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live 追一个主播,今晚在斗鱼、明晚又跑去哔哩哔哩,手…

2026/10/10 4:39:21 阅读更多 →
Zephyr嵌入式工作流:Github与树莓派的协同设计

Zephyr嵌入式工作流:Github与树莓派的协同设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 4:39:24 阅读更多 →

最新新闻

PCA9422与MK24FN1M0VDC12硬件协同电源管理设计

PCA9422与MK24FN1M0VDC12硬件协同电源管理设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:48:41 阅读更多 →
Copilot高效使用的四大前置工程实践

Copilot高效使用的四大前置工程实践

1. 项目概述:这不是一个功能推荐,而是一次务实的技术决策提醒“GitHub针对全新Copilot功能的建议:先尝试其他方法”——这个标题乍看像一句轻描淡写的提示,实则藏着一线开发者在真实协作场景中反复验证后沉淀下来的判断逻辑。它不…

2026/10/10 5:48:41 阅读更多 →
AI日报自动化生产全流程:从信息源搭建到筛选摘要的工程实践

AI日报自动化生产全流程:从信息源搭建到筛选摘要的工程实践

1. 一份AI日报的诞生逻辑:从信息洪流到结构化认知每天早上七点,我的信息采集脚本会准时跑完最后一轮抓取。屏幕上滚动的原始条目通常在800到1200条之间,涵盖学术预印本、开源社区动态、产品更新日志、行业观察博客、技术论坛热帖等十几个来源…

2026/10/10 5:48:41 阅读更多 →
Egg 内部库 @eggjs/module-common 解读:上下文 Symbol、4.0 破坏性变更与生命周期钩子演进

Egg 内部库 @eggjs/module-common 解读:上下文 Symbol、4.0 破坏性变更与生命周期钩子演进

后端Web框架 【免费下载链接】egg 🥚🥚🥚🥚 Born to build better enterprise frameworks and apps with Node.js & Koa. https://codewiki.google/github.com/eggjs/egg 项目地址: https://gitcode.com/gh_mirror…

2026/10/10 5:48:41 阅读更多 →
python-kubernetes aio 客户端中 V1StatefulSet 模型详解:字段、序列化与异步用法

python-kubernetes aio 客户端中 V1StatefulSet 模型详解:字段、序列化与异步用法

后端云原生容器编排 【免费下载链接】python Official Python client library for kubernetes 项目地址: https://gitcode.com/gh_mirrors/python1/python 点击查看 免费下载 V1StatefulSet 是 kubernetes Python 客户端(aio 异步版本)中对应…

2026/10/10 5:48:41 阅读更多 →
Apache Beam 附加输出(Additional Outputs / Side Outputs)实战指南:用 ParDo 单次处理实现多路 PCollection 分支

Apache Beam 附加输出(Additional Outputs / Side Outputs)实战指南:用 ParDo 单次处理实现多路 PCollection 分支

批处理流处理大数据 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam15/beam 点击查看 免费下载 导读 附加输出(additional outputs&…

2026/10/10 5:47:41 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →