芸芸小站 - 码道
type: channel
link: http://www.xiaoyunyun.net/index.php/category/program.html
description: 大道三千，殊途同归，代码之道，贵在精深。
items: 现代风蓝灰色主题PPT毕业设计答辩模板
items: 计算机专业毕业设计答辩幻灯片PPT整套模板，蓝色清新风格
items: 关于神经网络各种概念的小白解释
items: C++和JavaScript(JS)执行效率对比
items: 使用CGAL自带的最小二乘法拟合直线的方法
items: 使用C++实现OpenCL探针
items: 把文件转换成C/C++代码工具，《万物转Char》
items: 使用PCL实现LAS点云数据抽稀(即降采样)
items: 已安装好OSG、PCL、libLas、GDAL等包的vcpkg，直接下载
items: 如何使用OSG引擎显示PCL的点云数据？

现代风蓝灰色主题PPT毕业设计答辩模板
type: item
date: 2025-04-16T21:36:00+08:00
description: 这是一份为计算机毕业论文设计的PPT模板，适用于XX学院XXXXXX系的202X级1班学生。模板风格严谨实用，适合作为论文答辩的动态演示文稿。主要特点：封面设计：计算机毕业论文的专属PPT模板。包含答辩人和导师信息：答辩人名为“1猫某”，导师名为“11猫某”。目录页面：结构清晰，包含五部分内容：选题背景与意义、国内基本情况、研究目标与意义、研究内容与方法、项目团队介绍等。内容丰富：选题背景与意义：阐述研究动机和背景。国内基本情况：介绍当前国内相关领域的现状。研究目标：明确研究的主要目标和方向。研究内容与方法：详细介绍研究的具体内容和采用的方法。项目团队介绍：展示团队成员及其角色，社会关系网络。公司架构与大事记：描述公司的组织架构及行业相关的大事记。研究思路与方法：说明研究的具体步骤和思路。解决问题与可行性分析：列出待解决的问题并进行可行性分析。视觉效果：使用现代和专业的图表、图形和排版设计，确保内容易于理解和视觉上有吸引力。包括动态元素，使答辩过程更加生动。灵活性和可定制性：提供了大量的文本占位符和可编辑的设计元素，用户可以根据自己的研究内容和数据进行定制。使用建议：根据自己的研究内容和数据进行相应的替换和调整。确保每一页的内容简洁明了，重点突出。使用适当的动画和过渡效果，提升演示的视觉效果。这份模板旨在帮助答辩人高效、专业地展示研究成果，顺利通过论文答辩。预览图下载地址https://download.csdn.net/download/cy1_cy2006/90628646

计算机专业毕业设计答辩幻灯片PPT整套模板，蓝色清新风格
type: item
date: 2025-04-16T09:28:00+08:00
description: 一、模板基本信息此PPT模板是为计算机专业毕业设计答辩量身定制的，旨在帮助汇报人清晰地展示课题背景、研究意义、论述内容以及未来应用。模板设计简洁明了，适合在投影仪或计算机上进行演示，同时也支持打印输出。二、模板结构与内容封面页• 标题：毕业设计答辩（计算机专业）• 汇报人及时间：某某某，XXXX年XX月XX日• 附加信息：开题报告|毕业论文|毕业答辩|毕业设计目录页• 列出PPT的主要内容结构，包括：• 课题背景概述• 课题研究意义• 课题论述内容• 课题未来应用课题背景概述（第3-8页）• 这一部分旨在介绍课题的背景信息，包括课题的来源、研究领域的现状以及研究的重要性等。• 页面布局灵活，包含文字描述、图表和图片等元素，帮助汇报人全面展示课题背景。• 示例图片和图表占位符（如“/ppt/media/image7.png”等）提示汇报人在此处插入具体的内容。课题研究意义（第9-13页）• 详细介绍课题研究的目的、意义和价值，以及研究成果可能对学术界或实际应用产生的影响。• 同样包含文字描述、图表和图片等元素，使汇报内容更加生动、具体。• 提醒汇报人在占位符处添加实际内容，并适当调整布局以符合汇报需求。课题论述内容（第14-17页）• 深入阐述课题的研究内容、方法、过程和结果等。• 页面布局注重逻辑性和条理性，便于汇报人清晰地传达研究思路和成果。• 汇报人可根据具体研究内容在占位符处添加文字、图表和图片等元素。课题未来应用（第18-22页）• 探讨课题研究成果在未来可能的应用领域、应用方式和潜在价值。• 展示相关图表和图片，帮助听众更好地理解课题的应用前景。• 提醒汇报人在此部分充分展示课题的实用性和创新性。结尾页（第23页）• 感谢听众的聆听和指教，并表达对未来合作的期待。• 包含汇报人的姓名和时间信息，以及附加的开题报告、毕业论文等链接信息。三、使用说明• 汇报人可根据自己的研究内容和需求，在占位符处添加具体的文字、图表和图片等元素。• 注意保持页面布局的整洁和逻辑性，避免过多冗余的信息干扰听众的理解。• 在演示过程中，可充分利用投影仪或计算机进行演示，同时也可打印出PPT文稿进行辅助说明。此PPT模板为计算机专业毕业设计答辩提供了全面的展示框架和灵活的内容布局，汇报人可根据自己的需求进行适当调整和优化。下载地址pptx模板下载地址：https://download.csdn.net/download/cy1_cy2006/90626564预览图

关于神经网络各种概念的小白解释
type: item
date: 2023-08-06T10:35:00+08:00
description: 神经网络能干什么？神经网络能干的事情很多，目前最火的深度学习的核心。利用神经网络，可以实现人脸识别、手写字体识别、指纹识别、图片识别等等，目前最成功的就是GPT Chart了，它的核心也是神经网络。神经网络是什么？顾名思义，神经网络就是由多个神经元相互连接，组成的网络。神经元是一个生物学概念，指的是人和动物神经系统中的一种细胞，看起来是这样的：在计算机中肯定不存在神经细胞，所以伟大的程序猿们把它简化成了这个样子：程序猿们利用计算机的CPU或GPU，按照上图的流程来模拟神经元。Ix、Iy、Iz一直到In代表神经元的输入，每个输入都乘上对应的权重(图中W*)再全部加起来作为中间结果存储在图中的圆圈中。权重的作用是模拟神经元对不同信号的敏感程度，比如人的神经元，对轻轻抚摸的信号不敏感，但对用刀轻轻切割很敏感(^_^)。抚摸和切割可以视为两种输入信号，但因为权重不同，造成人对这种输入信号的敏感程度不同。姑且这样理解吧，对于一篇免费的小白文，你还能要求更多吗？中间结果会传递给阙值函数，阙值函数对其进行一定的运算后产生输出。为什么需要阙值函数？因为要模拟神经元的“抑制”现象。生物学家经过长时间研究，发现神经元并不是对所有输入都会产生输出。程序猿们为了模拟这种现象，引入了阙值函数，又叫激活函数，这类函数有很多，几乎所有非线性函数都可用作激活函数，比如sin、cos、tanh、sigmod等等。为什么不能用线性函数？嗯，专业的回答是：用线性函数就不能处理非线性问题。小白的回答是：线性函数一定会产生一个输出，因此不能模拟“抑制”现象。什么是线性函数？小白的回答：函数的图像看起来是一条直线的函数就是线性函数。专业的回答：小白不知道，请问百度大哥。神经网络的结构最简单的神经网络的结构看起来是这样的：图中每一个圆圈表示一个神经元，箭头表示数据的流动方向。数据首先进入输入层的各个神经元中，再流入隐层，最后再从输出层流出，从而产生整个神经网络的输出。数据从一个神经元流向另一个神经元时都要经过权重、求和、激活函数的运算，上图没有画出来，请参考上上图。神经网络中输入层和输出层是必须的，隐层是可选的，隐层的数量没有上限。隐层越多，神经网络的能力就越强，表现为能识别的类别越多、能存储的数据越大。理论上只要计算机算力够强，可以有无限多隐层，然而遗憾的是这个世界上从来就没有“足够快”的计算机，所以隐层的数量总是有限的。上图中的神经网络已经可以解决很多问题了，图片识别、人脸识别、物体分类等等都可以。然而这种所有神经元都彼此连接的网络有一个严重的缺陷，就是运算量大，造成运算过程非常缓慢，不适合用来处理大数据、高分辨率图像。其他类型的神经网络为了解决各种问题，睿智的程序猿们发明了各种各样的神经网络，比如循环神经网络、卷积神经网络、LSTM等等，大家可以自行百度相关资料。特别是这两年，新的神经网络结构如火山喷发一般出现，看得人眼花缭乱、晕头转向、心生敬畏进而顶礼膜拜。

C++和JavaScript(JS)执行效率对比
type: item
date: 2023-07-14T17:20:00+08:00
description: 做了一个C++程序和JS程序效率对比的小测试，性能差距在1.6倍到3倍之间。JS测试代码 C++测试代码// CppPerformanceTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <windows.h> #include <time.h> int main() { time_t beginTime = clock(); unsigned long long numberCount = 1000000000; double numberCountF = (double)numberCount; double avgValue = 0.0; for (unsigned long long i = 0; i < numberCount; ++i) { avgValue += (double)rand() / numberCountF; } time_t endTime = clock(); time_t elapsedTime = endTime - beginTime; printf("计算%llu个随机数的平均值耗时%llu毫秒。\n", numberCount, elapsedTime); printf("计算结果：%f\n", avgValue); system("pause"); } 在台式机上JS执行时间在16000毫秒左右，C++执行时间在10000毫秒左右。笔记本上JS执行时间46000毫秒左右，C++执行时间16000毫秒左右。

使用CGAL自带的最小二乘法拟合直线的方法
type: item
date: 2023-07-14T10:17:00+08:00
description: 现在网上能找到的CGAL教程很少了，很多教程由于时间久远，已经被搜索引擎沉底，不再优先展示了。本文的方法还是作者到处寻找，最后参考官方的例子做出来的，实在来之不易。bool fittingLine(const pcl::PointCloud<pcl::PointXYZ>::Ptr& pointCloud, const pcl::IndicesPtr& indices, pcl::PointXYZ& outPointOnLine, pcl::PointXYZ& outLineDirection) { // 定义CGAL的Kernal typedef CGAL::Simple_cartesian<float> K; typedef K::Line_3 Line; typedef K::Plane_3 Plane; typedef K::Point_3 Point; typedef K::Triangle_3 Triangle; typedef K::Direction_3 Direction; // 参数检查 if (pointCloud == nullptr || pointCloud->empty()) { return false; } if (indices != nullptr && indices->empty()) { return false; } // 把PCL的点格式转换成CGAL的点格式，兼容不提供索引的情况 std::vector<Point> cgalPoints; if (indices != nullptr) { cgalPoints.reserve(indices->size()); for (int pointIndex : *indices) { const pcl::PointXYZ& pclPoint = pointCloud->at(pointIndex); cgalPoints.push_back(Point(pclPoint.x, pclPoint.y, pclPoint.z)); } } else { cgalPoints.reserve(pointCloud->size()); for (const pcl::PointXYZ& pclPoint : *pointCloud) { cgalPoints.push_back(Point(pclPoint.x, pclPoint.y, pclPoint.z)); } } // 利用CGAL拟合三维直线，官方文档说使用的是最小二乘法 Line line; linear_least_squares_fitting_3(cgalPoints.begin(), cgalPoints.end(), line, CGAL::Dimension_tag<0>()); // 返回拟合结果 const Point& linePoint = line.point(); const Direction& lineDirection = line.direction(); outPointOnLine.x = linePoint.x(); outPointOnLine.y = linePoint.y(); outPointOnLine.z = linePoint.z(); outLineDirection.x = lineDirection.dx(); outLineDirection.y = lineDirection.dy(); outLineDirection.z = lineDirection.dz(); return true; } 这个函数接受的参数都是PCL的类型，这样可以和PCL相互配合，处理点云。

使用C++实现OpenCL探针
type: item
date: 2022-05-04T17:21:00+08:00
description: OpenCL是一个并行计算工业标准，相比OpenGL，OpenCL的特长是并行计算，而OpenGL的特长是图像渲染。最近研究OpenCL的时候发现相关的工具还是比较少，学习和使用都不是很方便，因此特编写了一个简单的OpenCL探针。这款名叫《OpenCLMonitor》的软件可以列出计算机上所有支持OpenCL的设备，每个设备的信息，包括设备名称、设备厂商、工作组维度、工作组大小等等。《OpenCLMonitor》使用了OpenCL的C++语言API，相比C语言API，C++语言API使用更容易，传递的参数更少、代码长度更短。OpenCLMonitor代码// OpenCLMonitor.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // //#define CL_HPP_ENABLE_EXCEPTIONS #define CL_HPP_TARGET_OPENCL_VERSION 210 #include <iostream> #include "cl/cl2.hpp" #define PRINT_PLATFORM_INFO(PLATFORM, INFO_NAME) \ {\ std::string platformInfo;\ int rs = PLATFORM.getInfo(INFO_NAME, &platformInfo);\ if (rs == CL_SUCCESS)\ {\ std::cout << #INFO_NAME << ":\t" << platformInfo << std::endl;\ }\ else\ {\ std::cout << #INFO_NAME << ":\t" << "error(" << rs << ")" << std::endl;\ }\ } #define PRINT_DEVICE_INFO(DEVICE, INFO_NAME) \ {\ int rs = CL_SUCCESS;\ auto deviceInfo = DEVICE.getInfo<INFO_NAME>(&rs);\ std::string infoNameStr(#INFO_NAME ":");\ while (infoNameStr.size() < 40)\ {\ infoNameStr.push_back(' ');\ }\ if (rs == CL_SUCCESS)\ {\ std::cout << "\t" << infoNameStr << "\t" << deviceInfo << std::endl;\ }\ else\ {\ std::cout << "\t" << infoNameStr << "\t" << "error(" << rs << ")" << std::endl;\ }\ } #define PRINT_DEVICE_INFO_SIZE_T_ARRAY(DEVICE, INFO_NAME) \ {\ int rs = CL_SUCCESS;\ auto deviceInfo = DEVICE.getInfo<INFO_NAME>(&rs);\ std::string infoNameStr(#INFO_NAME ":");\ while (infoNameStr.size() < 40)\ {\ infoNameStr.push_back(' ');\ }\ if (rs == CL_SUCCESS)\ {\ std::cout << "\t" << infoNameStr << "\t"; \ for (auto it = deviceInfo.begin(); it != deviceInfo.end(); it++)\ {\ std::cout << *it << ",";\ }\ std::cout << std::endl;\ }\ else\ {\ std::cout << "\t" << infoNameStr << "\t" << "error(" << rs << ")" << std::endl;\ }\ } int main() { std::cout << "OpenCL monitor, powered by http://www.xiaoyunyun.net." << std::endl << std::endl; std::vector<cl::Platform> platforms; cl::Platform::get(&platforms); if (platforms.empty()) { std::cout << "No OpenCL platform found." << std::endl; return 0…

把文件转换成C/C++代码工具，《万物转Char》
type: item
date: 2022-02-26T23:27:00+08:00
description: 最近在研究单片机，想在ESP8266上实现一个小型的Web服务器，但是怎么把HTML写入ESP8266成了个问题。虽然官方有提供烧写HTML到Flash，然后从Flash载入的方法，但是这个方法并不通用，换了其他单片机肯定又不能用了。怎么办呢？我想到了效仿Qt，把资源文件转换成C/C++代码，直接编译进固件里。这样不管什么单片机，只要用C/C++开发都可以使用这个方法。为了把文件转换成C/C++代码，我写了个小工具，现在放出来给大家用。所有人都可以从这里下载这个工具，并免费使用。特别的，如果用于商业用途，请邮箱联系我190258603@qq.com。使用方法如图所示，首先点击1号按钮添加文件，可一次添加多个文件，也可添加多次；然后点击2号按钮选择生成的文件名，可生成.c或.cpp文件；最后点击3号按钮，开始生成，视文件大小，所需时间不同。注意事项这个工具只是简单的做了个转换，使用时请考虑你单片机的存储空间大小、内存大小等等，不要超出单片机的Flash大小，否则烧写固件可能会失败。这个工具我使用Qt5.14.2和VS2017编译，如果缺库请安装对应版本的VC_Redist，可从微软官方下载安装程序。下载地址Release.rar http://www.xiaoyunyun.net/usr/uploads/2022/02/2360157034.rar

使用PCL实现LAS点云数据抽稀(即降采样)
type: item
date: 2021-10-07T12:02:00+08:00
description: PCL中的VoxelGrid类提供了降采样功能，使用VoxelGrid可方便的实现点云数据抽稀，请看代码：#include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> #include "LasLoader.h" #include "PointCloudViewer.h" int main() { pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud = LasLoader::loadLas("420-432_realColor_small_Cloud.las"); pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGBA>()); std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height << " data points (" << pcl::getFieldsList(*cloud) << ")." << std::endl; // Create the filtering object pcl::VoxelGrid<pcl::PointXYZRGBA> sor; sor.setInputCloud(cloud); sor.setLeafSize(2.01f, 2.01f, 2.01f); sor.filter(*cloud_filtered); std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points (" << pcl::getFieldsList(*cloud_filtered) << ")." << std::endl; PointCloudViewer viewer; viewer.showCloud(cloud); PointCloudViewer viewer2; viewer2.showCloud(cloud_filtered); while (viewer.isDone() == false || viewer2.isDone() == false) { if (viewer.isDone() == false) { viewer.renderFrame(); } if (viewer2.isDone() == false) { viewer2.renderFrame(); } } return (0); } LasLoader和PointCloudViewer的源码参见文章：如何使用OSG引擎显示PCL的点云数据？完整Visual Studio 2017工程下载:Filtering-Downsample.rar

已安装好OSG、PCL、libLas、GDAL等包的vcpkg，直接下载
type: item
date: 2021-10-06T10:20:00+08:00
description: 为了学习Pcl，经历九九八十一难，终于配置好了vcpkg。由于国内网络的原因，vcpkg自动下载包慢得像龟爬，本人只好买了个迅雷会员，花了两天时间硬是用迅雷下载好了所需的包，最终做成了这个vcpkg完全版，需要的袁们请来直接拿走，不谢！下载地址链接：https://pan.baidu.com/s/1xIFZKBlyJjVA-F_WZjhiRA 提取码：alfdvcpkg可以和VS集成，不用配置包含目录和库目录，也不用配置引用库名称，直接在代码里面#include "xxx"就行了，非常方便，不会使用的袁请自行百度。已安装的包boost-accumulators:x64-windows 1.75.0 Boost accumulators module boost-algorithm:x64-windows 1.75.0 Boost algorithm module boost-align:x64-windows 1.75.0 Boost align module boost-any:x64-windows 1.75.0 Boost any module boost-array:x64-windows 1.75.0 Boost array module boost-asio:x64-windows 1.75.0#1 Boost asio module boost-assert:x64-windows 1.75.0 Boost assert module boost-assign:x64-windows 1.75.0 Boost assign module boost-atomic:x64-windows 1.75.0#1 Boost atomic module boost-beast:x64-windows 1.75.0 Boost beast module boost-bimap:x64-windows 1.75.0 Boost bimap module boost-bind:x64-windows 1.75.0 Boost bind module boost-build:x64-windows 1.75.0 Boost.Build boost-callable-traits:x64-windows 1.75.0 Boost callable_traits module boost-chrono:x64-windows 1.75.0#1 Boost chrono module boost-circular-buffer:x64-windows 1.75.0 Boost circular_buffer module boost-compatibility:x64-windows 1.75.0 Boost compatibility module boost-compute:x64-windows 1.75.0 Boost compute module boost-concept-check:x64-windows 1.75.0#2 Boost concept_check module boost-config:x64-windows 1.75.0 Boost config module boost-container-hash:x64-windows 1.75.0 Boost container_hash module boost-container:x64-windows 1.75.0#1 Boost container module boost-context:x64-windows 1.75.0#4 Boost context module boost-contract:x64-windows 1.75.0#1 Boost contract module boost-conversion:x64-windows 1.75.0 Boost conversion module boost-convert:x64-windows 1.75.0 Boost convert module boost-core:x64-windows 1.75.0 Boost core module boost-coroutine2:x64-windows 1.75.0 Boost coroutine2 module boost-coroutine:x64-windows 1.75.0#1 Boost coroutine module boost-crc:x64-windows 1.75.0 Boost crc module boost-date-time:x64-windows 1.75.0#1 Boost date_time module boos…

如何使用OSG引擎显示PCL的点云数据？
type: item
date: 2021-10-06T09:54:00+08:00
description: 最近开始学习PCL库，出师不利，一开始就踩了个坑。PCL库的visualization不能同时开两个CloudViewer，一开就报错，但是不开两个我怎么比较处理前和处理后的数据呢？不得不放弃使用CloudViewer，自己用OSG写了一个类似的东西，废话多不说，请看代码：PointCloudViewer.h#pragma once namespace osg { class Group; class Geometry; class Program; } namespace osgViewer { class Viewer; } class PointCloudViewer { public: enum ColorMode { // 按数据的Z值大小显示不同的颜色 HeightColor = 0, // 显示数据自带的颜色 DataColor = 1, // 把数据自带的颜色处理成黑白进行显示 GrayColor = 2, // 按强度着色 IntensityColor = 3, }; typedef pcl::PointCloud<pcl::PointXYZRGBA>::Ptr DataType; public: struct NodeData { osg::ref_ptr<osg::Geometry> geometry; osg::ref_ptr<osg::Geode> geode; osg::ref_ptr<osg::Program> shader; std::map<std::string, osg::ref_ptr<osg::Uniform>> shaderParameters; }; public: PointCloudViewer(); virtual ~PointCloudViewer(); public: void showCloud(pcl::PointCloud<pcl::PointXYZRGBA>::Ptr data); void setColorMode(ColorMode colorMode); void setColorMode(const DataType& data, ColorMode colorMode); void setDepthCheck(const DataType& data, bool enabled); NodeData* getNodeData(const DataType& data); bool isDone() const; void renderFrame(); private: void initOsg(); private: std::map<DataType, NodeData> mDatas; osg::ref_ptr<osg::Group> mRoot; osg::ref_ptr<osgViewer::Viewer> mViewer; };PointCloudViewer.cpp#include "pch.h" #include "PointCloudViewer.h" #include "Shaders.h" PointCloudViewer::PointCloudViewer() { initOsg(); } PointCloudViewer::~PointCloudViewer() { } void PointCloudViewer::initOsg() { //创建Viewer对象，场景浏览器 mViewer = new osgViewer::Viewer(); mViewer->setThreadingModel(osgViewer::Viewer::SingleThreaded); //设置图形环境特性 osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits(); traits->x = 0; traits->y = 0; traits->width = 640; traits->height = 480; traits->windowDecoration = true; traits->doubleBuffer = true; traits->sharedContext = 0; traits->vsync = false; //创建图形环境特性 osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); if (gc.valid()) { osg::notify(osg::INFO) << "…