从零到图像处理:用VisionMaster4.3.0+WinForm实现第一个圆检测应用

# 从零到图像处理:用VisionMaster4.3.0+WinForm实现第一个圆检测应用 机器视觉项目从原型到落地,往往卡在算法集成与工程化这一步。自己从头实现一个鲁棒的圆检测算法,不仅要处理复杂的图像预处理、边缘检测和霍夫变换,还得应对光照变化、噪声干扰和性能优化,没个把月时间根本下不来。但如果你手头有像海康VisionMaster(VM)这样的成熟算法平台,情况就完全不同了。它把那些经过工业场景千锤百炼的视觉算法打包成了即插即用的模块,我们开发者要做的,就是学会如何在自己的C# WinForm应用里“召唤”并使用它们。 这篇文章,就是为你准备的“召唤指南”。我们不谈枯燥的理论,也不做泛泛的环境配置教程,而是聚焦于一个非常具体的目标:**在Visual Studio 2019中,从零开始构建一个能够加载VM方案、执行圆检测流程并直观显示结果的Windows桌面应用。** 你会看到如何将VM的控件拖到你的窗体上,如何用几行代码驱动一个完整的视觉流程,以及如何把检测到的圆心坐标和半径从算法模块里“掏出来”,显示在你自己的UI控件里。整个过程就像搭积木,但搭出来的却是一个具备实用价值的专业工具。无论你是刚接触机器视觉二次开发的工程师,还是希望快速验证VM能力的技术决策者,这篇手把手、代码级详尽的指南都能让你在半天内跑通第一个Demo,真切感受到“配置即用”的效率。 ## 1. 搭建你的专属视觉开发沙箱 在开始写第一行业务代码之前,我们需要把舞台搭好。这个舞台就是你的开发环境——一个专为VM二次开发准备的Visual Studio项目。很多人觉得环境配置是琐碎的体力活,但恰恰是这里的每一步,都决定了后续开发是顺风顺水还是步步惊心。我们以VS2019和VM4.3.0这个经典组合为例,目标是创建一个稳定、可复用的项目模板。 ### 1.1 项目创建与关键属性设置 打开Visual Studio 2019,选择“创建新项目”,在模板中找到“Windows窗体应用(.NET Framework)”。这里有个**至关重要的选择**:目标框架。VM 4.3.0的控件库是基于.NET Framework 4.6.1构建的,因此你的项目框架必须选择4.6.1或更高版本。我个人的习惯是直接选择`.NET Framework 4.7.2`,它在兼容性和现代特性之间取得了不错的平衡。 项目创建好后,别急着写代码,先右键点击项目名称,进入“属性”设置页。这里有几个坑需要提前避开: 1. **生成选项卡**:找到“平台目标”设置。**务必取消勾选“首选32位”**。因为VM的底层库大多是64位的,在“Any CPU”模式下勾选“首选32位”,运行时可能会尝试以32位进程加载64位DLL,导致神秘的`BadImageFormatException`异常。保险起见,你可以直接将“平台目标”设置为`x64`。 2. **调试选项卡**(可选但推荐):如果你打算将VM的方案文件(.sol)或图像资源放在项目目录下,可以在这里将“工作目录”设置为`$(ProjectDir)`,这样代码中使用相对路径会更方便。 完成设置后,点击菜单栏的“生成”->“重新生成解决方案”,确保项目能正常编译。这个简单的动作能帮你提前发现一些基础配置问题。 ### 1.2 引入VM的核心力量:引用与控件 现在,空白的WinForm项目还只是一个普通的Windows应用,我们需要把VM的“大脑”和“手脚”引进来。这分为两步:添加程序集引用和导入工具箱控件。 **第一步:添加必要的DLL引用。** 在解决方案资源管理器中,右键点击项目的“引用”文件夹,选择“添加引用”。点击“浏览”按钮,导航到你的VM安装目录。对于VM 4.3.0,核心的动态库通常位于: `C:\Program Files\VisionMaster4.3.0\Application\myLibs\` 你需要添加以下关键DLL(具体文件名可能因版本略有差异,请以实际目录为准): | DLL文件 | 主要作用 | | :--- | :--- | | `VM.Core.dll` | VM解决方案和流程管理的核心库 | | `VM.PlatformSDKCS.dll` | 提供给C#的底层平台SDK接口 | | `VMControls.Interface.dll` | 控件接口定义 | | `VMControls.Winform.Release.dll` | WinForm专用控件实现 | | `VMFBase.dll` | 基础框架库 | | `Apps.ColorFun.DLL` | 色彩处理相关算法模块 | 添加引用后,**一个关键操作**:在解决方案资源管理器中,逐一选中刚才添加的这些引用,在属性窗口中将“复制本地”设置为`False`。这是因为VM的运行时依赖它自己安装目录下的一套完整环境,我们不需要(也最好不要)把这些DLL复制到项目的输出目录,避免版本冲突。 **第二步:将VM控件“请进”工具箱。** 这是让开发变得可视化的关键。打开你的Form1窗体设计器,在左侧工具箱的“常规”或“所有Windows窗体”选项卡上右键,选择“选择项...”。在弹出的对话框中,点击“.NET Framework组件”选项卡下的“浏览”按钮。这次,导航到VM安装目录下的控件库文件,例如: `C:\Program Files\VisionMaster4.3.0\Development\V4.x\ComControls\Assembly\VMControls.Winform.Release.dll` 选中并打开后,列表中会出现一系列前缀为`VM`的组件(如`VMRenderControl`, `VMImageBox`等),全选并确定。稍等片刻,你就会在工具箱里看到一个“VM”分组,里面躺着可用的控件了。把它们拖到窗体上,对应的引用会自动添加到项目中。 ## 2. 设计应用界面与核心控件解析 有了VM控件,我们的应用界面就有了灵魂。一个好的UI设计不是为了好看,而是为了高效地组织信息流和控制流。对于一个圆检测应用,我们需要几个核心功能区:图像显示区、控制面板和结果展示区。 ### 2.1 界面布局与控件拖拽 打开`Form1.cs`的设计视图,我们从工具箱拖入以下控件: 1. **`VMRenderControl`**:这是**最重要的控件**,负责渲染VM算法模块的处理结果,比如将检测到的圆叠加显示在图像上。把它拖到窗体左侧,拉大一些,作为主视图。 2. **`PictureBox`**(标准WinForm控件):我们可以用它来显示原始图像,与`VMRenderControl`的处理结果形成对比。放在`VMRenderControl`旁边或下方。 3. **`Button`控件**:我们需要至少三个按钮。 * `btnLoadSolution`:用于加载VM方案文件(.sol)。 * `btnRun`:执行一次检测流程。 * `btnGetResult`:获取并显示圆检测的具体结果。 4. **`TextBox`或`Label`控件**:用于显示结果,例如圆心X坐标、圆心Y坐标、半径。通常用几个`Label`做描述,旁边跟上`TextBox`来显示数值。 5. **`ListBox`或`TextBox`(多行)**:用于显示程序运行的日志信息,比如“方案加载成功”、“流程执行完毕”或错误信息,这对于调试非常有用。 你的窗体布局可能看起来像这样: ``` [VMRenderControl] [PictureBox (原始图)] [btnLoadSolution] [btnRun] [btnGetResult] 圆心 X: [TextBox_X] 圆心 Y: [TextBox_Y] 半径 R: [TextBox_R] [Log ListBox] ``` 别忘了为这些控件起一个见名知意的变量名,这是良好编程习惯的开始。 ### 2.2 理解VMRenderControl的双重角色 `VMRenderControl`不是一个简单的图片框。它是连接你的UI和VM算法世界的桥梁,扮演着两个关键角色: * **渲染器**:当将一个VM算法模块(如圆查找模块)赋值给它的`ModuleSource`属性后,它能自动将该模块的输入图像、处理结果(如轮廓、圆心、拟合圆)以图形化的方式绘制出来。你无需自己写任何绘图代码。 * **交互器**:一些高级的`VMRenderControl`支持通过鼠标在控件上直接进行ROI(感兴趣区域)的绘制与调整,这些交互数据会实时反馈到绑定的算法模块参数中。 在后续的代码中,我们会看到如何将一个圆查找模块的实例赋值给它: ```csharp // 假设circleFindTool是一个圆查找模块的实例 vmRenderControl1.ModuleSource = circleFindTool; ``` 执行这行代码后,`vmRenderControl1`上就会立刻显示出该模块处理后的视觉结果。 ## 3. 编写驱动逻辑:加载、执行与获取结果 界面准备就绪,现在我们来注入灵魂——事件处理代码。我们将按照“加载方案 -> 执行流程 -> 获取结果”这个核心链路来编写。 ### 3.1 加载VM解决方案文件 首先,在代码文件顶部添加必要的命名空间引用: ```csharp using VM.Core; using VM.PlatformSDKCS; // 根据你实际使用的圆查找模块,可能需要添加类似下面的引用 // using IMVSCircleFindModuCs; ``` 然后,双击“加载方案”按钮,生成其`Click`事件处理函数。在这个函数里,我们需要做两件事:让用户选择一个.sol文件,然后调用VM的API加载它。 ```csharp private void btnLoadSolution_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "VM Solution Files (*.sol)|*.sol"; openFileDialog.Title = "选择VisionMaster方案文件"; if (openFileDialog.ShowDialog() == DialogResult.OK) { string solutionPath = openFileDialog.FileName; try { // 核心代码:导入解决方案 VmSolution.Import(solutionPath, ""); // 第二个参数是方案密码,默认为空 LogMessage($"方案加载成功: {Path.GetFileName(solutionPath)}"); // 方案加载后,可以在这里初始化一些UI状态,比如启用执行按钮 btnRun.Enabled = true; } catch (VmException ex) { // VM操作几乎都会抛出VmException,务必捕获处理 LogMessage($"方案加载失败! 错误码: 0x{ex.ErrorCode:X8}"); MessageBox.Show($"加载失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (Exception ex) { // 捕获其他异常,如文件不存在等 LogMessage($"发生未知异常: {ex.Message}"); MessageBox.Show($"发生错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } // 一个简单的日志记录辅助方法 private void LogMessage(string message) { if (listBoxLog.InvokeRequired) { listBoxLog.Invoke(new Action<string>(LogMessage), message); } else { listBoxLog.Items.Add($"[{DateTime.Now:HH:mm:ss}] {message}"); listBoxLog.TopIndex = listBoxLog.Items.Count - 1; // 自动滚动到底部 } } ``` 这段代码有几个要点: * `VmSolution.Import`是加载方案的入口。它会在内存中创建整个解决方案的模型。 * `VmException`是VM SDK特有的异常类型,其`ErrorCode`属性包含了具体的错误信息,通过十六进制格式输出便于查询官方文档。 * 使用`Invoke`进行线程安全的UI更新,因为方案加载操作可能是耗时的。 ### 3.2 执行视觉流程 方案加载后,其中包含的“流程”就可以被获取和执行了。假设你的方案中有一个名为“流程1”的流程,里面包含一个叫“圆查找1”的模块。 双击“执行”按钮,编写以下代码: ```csharp private void btnRun_Click(object sender, EventArgs e) { // 1. 获取流程对象 VmProcedure targetProcess = (VmProcedure)VmSolution.Instance["流程1"]; if (targetProcess == null) { LogMessage("错误:未找到名为‘流程1’的流程。"); return; } // 2. 获取圆查找模块对象,并将其绑定到渲染控件 // 注意:模块的完整路径是“流程名.模块名” IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"]; if (circleFindTool != null) { // 将模块绑定到渲染控件,这样结果就能可视化 vmRenderControl1.ModuleSource = circleFindTool; LogMessage("已绑定圆查找模块到渲染控件。"); } // 3. 在新线程中执行流程,避免阻塞UI Task.Run(() => { try { LogMessage("开始执行流程..."); targetProcess.Run(); // 执行流程 LogMessage("流程执行完成。"); // 执行完成后,可以提示用户去获取结果 this.Invoke(new Action(() => { btnGetResult.Enabled = true; LogMessage("请点击‘获取结果’查看检测数据。"); })); } catch (VmException ex) { LogMessage($"流程执行失败! 错误码: 0x{ex.ErrorCode:X8}"); } }); } ``` 这里的关键是`VmSolution.Instance`,它是一个全局的单例,通过字符串索引器可以访问到方案中任何已命名的对象(流程、模块等)。`targetProcess.Run()`会触发该流程下所有模块按顺序执行一次。 ### 3.3 提取并显示检测结果 流程执行完毕,算法结果已经存储在对应的模块对象中。现在我们需要把这些数据“挖”出来。 双击“获取结果”按钮: ```csharp private void btnGetResult_Click(object sender, EventArgs e) { // 再次获取圆查找模块实例 IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"]; if (circleFindTool == null) { LogMessage("错误:未找到圆查找模块。"); return; } // 检查模块是否已成功执行并产生结果 // 通常可以通过 ModuResult 或类似的属性访问结果 var result = circleFindTool.ModuResult; if (result != null && result.IsSuccess) // IsSuccess属性需查阅具体模块接口 { // 假设输出圆的属性叫OutputCircle var detectedCircle = result.OutputCircle; textBoxCenterX.Text = detectedCircle.CenterPoint.X.ToString("F2"); // 保留两位小数 textBoxCenterY.Text = detectedCircle.CenterPoint.Y.ToString("F2"); textBoxRadius.Text = detectedCircle.Radius.ToString("F2"); LogMessage($"结果 -> 圆心: ({detectedCircle.CenterPoint.X:F2}, {detectedCircle.CenterPoint.Y:F2}), 半径: {detectedCircle.Radius:F2}"); } else { LogMessage("未检测到圆或模块执行未成功。"); textBoxCenterX.Text = "N/A"; textBoxCenterY.Text = "N/A"; textBoxRadius.Text = "N/A"; } } ``` > **注意**:上述代码中`IMVSCircleFindModuCs`命名空间和`OutputCircle`等属性名称是**示例**,实际使用时,你必须根据VM SDK对应版本的API文档进行确认。不同版本的模块接口类名和属性名可能会有差异。最可靠的方法是,在添加了正确的DLL引用后,在代码中输入`VMSolution.Instance[“流程1.圆查找1”]`并进行强制转换时,依靠Visual Studio的智能提示来查看具体的类型和成员。 ## 4. 进阶技巧与实战避坑指南 跑通第一个Demo只是起点。要让这个应用真正健壮、实用,还需要考虑更多细节。下面这些技巧和坑,都是我实际项目中用“时间”换来的经验。 ### 4.1 资源管理与异常处理 VM的某些操作可能涉及非托管资源(如图像缓存、硬件连接)。确保在窗体关闭时妥善释放。 ```csharp private void Form1_FormClosing(object sender, FormClosingEventArgs e) { try { // 清理当前绑定的模块源 if (vmRenderControl1 != null) { vmRenderControl1.ModuleSource = null; } // 如果有全局的方案实例,考虑释放它(根据SDK文档决定) // VmSolution.Instance?.Dispose(); } catch (Exception ex) { // 记录日志,但通常不阻止关闭 Debug.WriteLine($"清理资源时发生异常: {ex.Message}"); } } ``` **异常处理要具体**。除了`VmException`,还要注意`System.IO`异常(文件访问)、`System.InvalidCastException`(类型转换错误,通常是模块路径名写错了)等。给用户友好的提示,并在日志中记录详细的调试信息。 ### 4.2 动态参数调整与实时预览 一个高级功能是允许用户在界面上动态调整算法参数(比如圆查找的半径范围、边缘阈值),并实时看到效果。这需要: 1. **获取模块参数对象**:通过模块实例的属性(如`ModuParam`)获取参数对象。 2. **绑定到UI控件**:将参数对象的属性(如`MinRadius`, `MaxRadius`)与`NumericUpDown`(数字框)等控件的`Value`属性进行数据绑定,或者手动在控件的`ValueChanged`事件中更新参数。 3. **触发重新执行**:参数改变后,重新执行流程或调用模块的`Run`方法,`VMRenderControl`会自动更新显示。 ```csharp // 伪代码示例:更新圆查找的最小半径参数 private void numericUpDownMinRadius_ValueChanged(object sender, EventArgs e) { var circleFindTool = VmSolution.Instance["流程1.圆查找1"] as IMVSCircleFindModuCs.IMVSCircleFindModuTool; if (circleFindTool?.ModuParam != null) { circleFindTool.ModuParam.MinRadius = (double)numericUpDownMinRadius.Value; // 可以添加一个“应用参数”按钮,或者防抖处理后自动执行 // Task.Run(() => { circleFindTool.Run(); }); } } ``` ### 4.3 性能考量与多线程 图像处理可能耗时。务必确保所有耗时的操作(如`Run()`)都在后台线程(如`Task.Run`)中执行,避免冻结UI。同时,所有对UI控件的更新都必须通过`Control.Invoke`或`Control.BeginInvoke`回到UI线程进行。 对于需要连续处理(如从相机抓图并检测)的场景,要考虑使用生产者-消费者模式或异步流水线,并注意及时释放不再使用的图像内存,防止内存泄漏。 最后,记得在开发过程中充分利用VM算法平台本身。先在VM图形化界面中精心调试好你的圆查找方案,确保参数在各类样本图像上都能稳定工作,然后再进行二次开发。这样,你的代码主要就负责“调度”和“集成”,而最复杂的算法鲁棒性问题,已经由VM平台解决了。当你看到自己编写的简洁WinForm程序,流畅地调用着强大的视觉算法并给出精准结果时,那种成就感,正是驱动我们不断探索技术整合的魅力所在。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

Python内容推荐

DeepChem开源AI药物化学框架源码|Python分子机器学习/药物预测项目

DeepChem开源AI药物化学框架源码|Python分子机器学习/药物预测项目

1. 项目简介:DeepChem是面向化学、生物制药领域的开源深度学习框架,基于Python+TensorFlow/PyTorch,实现分子结构建模、药物活性预测、化合物属性仿真、量子化学计算等AI建模能力; 2. 压缩包内容:全量框架源码、分子数据集样例、多场景实战案例、环境配置文档与依赖清单; 3. 适用人群:计算化学研究者、AI制药方向开发、生物信息专业学生、深度学习跨界科研练手; 4. 运行环境:Python3.8+,附带conda一键环境部署脚本。

Python Supervision 计算机视觉工具库完整源码|目标检测标注与图像处理工程

Python Supervision 计算机视觉工具库完整源码|目标检测标注与图像处理工程

本资源为 Supervision 开源 CV 工具库完整源码压缩包,是基于 OpenCV、PyTorch 封装的轻量化视觉工具,用于目标检测框绘制、分割掩码可视化、数据集标注、视频帧处理。 1. 适用人群:计算机视觉算法工程师、深度学习学习者、AI 图像标注研发人员、目标检测项目开发者; 2. 适用场景:YOLO/Detectron2 等模型结果可视化、图像数据集批量标注、安防视频目标追踪、算法落地调试; 3. 配套内容:源码附带各类模型对接示例、环境部署文档、实战案例代码,解决 Github 下载卡顿问题,配置依赖即可运行。

Python 回测框架 backtesting-py 完整源码|量化策略历史回测工程代码

Python 回测框架 backtesting-py 完整源码|量化策略历史回测工程代码

本资源为 backtesting-py 量化回测开源项目完整源码压缩包,是轻量化 Python 量化回测工具,依托 Pandas 实现 K 线数据导入、策略回测、绩效指标计算、收益可视化绘图。 1. 适用人群:量化交易者、Python 数据分析工程师、金融专业学生、个人程序化交易爱好者; 2. 适用场景:股票 / 加密货币 / 期货策略历史回测、交易模型验证、多因子策略快速测试; 3. 配套内容:源码附带多套实战策略示例、数据接入教程、环境安装文档,免去 GitHub 下载限制,本地配置依赖即可运行回测。

VisionMaster 4.4算子SDK[项目代码]

VisionMaster 4.4算子SDK[项目代码]

在使用本SDK时,用户可以通过指定的下载地址获取VisionMaster 4.4.0的相关资源。

VisionMaster SDK开发环境配置[可运行源码]

VisionMaster SDK开发环境配置[可运行源码]

最后,文章还提到了VisionMaster 4.2相较于之前版本的改进之处,强调了新版本在二次开发方面的便捷性,以及在运行效率上的提升。

ARTIS_MP_GEMCMS_GEMCMV_CN (1).pdf

ARTIS_MP_GEMCMS_GEMCMV_CN (1).pdf

ARTIS_MP_GEMCMS_GEMCMV_CN (1)

通用相机库:CameraLib

通用相机库:CameraLib

1. 统一接口层 :通过 ICamera 接口 + BaseCamera 抽象基类,定义了工业相机的通用能力(枚举设备、连接、采图、曝光/增益/触发模式等参数配置),让上层业务代码不依赖具体相机品牌。 2. 支持双图像格式输出 : - System.Drawing.Bitmap (适用于常规 WinForms/WPF 显示) - HalconDotNet.HObject (直接对接 Halcon 视觉算法库) 3. 当前已实现海康相机 : HiKCamera 基于 MvCameraControl.Net SDK,支持 GigE、USB、GenTL 等协议,包含软触发、硬触发、IO 控制、自动白平衡等功能。 4. 目标框架 : .NET 8-windows ,同时引用了 MVTec.HalconDotNet-Windows (Halcon 机器视觉库)。

【三菱】M800 M80 E80系列 PLC编程说明书.pdf

【三菱】M800 M80 E80系列 PLC编程说明书.pdf

【三菱】M800 M80 E80系列 PLC编程说明书

西门子V90伺服驱动器手册

西门子V90伺服驱动器手册

代码转载自:https://pan.quark.cn/s/a4b39357ea24 ProfiNet 西门子PLC

A powerful browser assistant for vibe surfing 一个开源的AI浏览器智能助手.zip

A powerful browser assistant for vibe surfing 一个开源的AI浏览器智能助手.zip

AI 解题助手,考试助手,在「面试」或「在线考试」时,借助AI实时提供解题思路和答案。

圆锥筛-LS40-60型圆锥筛的设计.rar

圆锥筛-LS40-60型圆锥筛的设计.rar

圆锥筛-LS40-60型圆锥筛的设计.rar

【生物信息学】基于AI大模型的基因筛选平台:多场景遗传病与药物靶点自动化分析系统设计

【生物信息学】基于AI大模型的基因筛选平台:多场景遗传病与药物靶点自动化分析系统设计

内容概要:本文提出了一套完整的AI基因筛选项目可执行落地方案,旨在通过AI大模型与生物信息学深度融合,构建标准化、高精度的基因筛选平台。项目聚焦遗传病、肿瘤、药物靶点和健康风险四大应用场景,采用“数据层-算法层-模型层-应用层”四层轻量化架构,利用公开合规数据集和生物大模型进行微调,实现基因变异自动化筛查与临床意义解读。方案明确了分阶段可量化目标,涵盖技术验证、商业化落地到规模化扩张的全过程,并配套详细的执行步骤、合规风控体系、团队配置与预算规划,确保项目低风险、低成本、高效推进。; 适合人群:具备生物信息学、AI算法或医疗科技背景的创业者、科研机构技术人员、健康管理企业产品经理及药企研发人员;适合关注AI+生命科学交叉领域的投资方与项目管理者。; 使用场景及目标:①为科研机构提供高通量基因筛选工具,提升研究效率;②助力医疗机构实现遗传病辅助诊断与健康风险评估;③支持药企开展新药靶点发现;④推动AI在基因分析中的合规化、产品化落地。; 阅读建议:此方案强调技术可行性与商业落地并重,建议读者结合自身资源聚焦细分场景切入,重点关注数据合规性、模型迭代机制与B端客户需求匹配,逐步构建技术壁垒与服务体系。

万能外圆磨床液压传动系统设计(论文+DWG图纸).rar

万能外圆磨床液压传动系统设计(论文+DWG图纸).rar

万能外圆磨床液压传动系统设计(论文+DWG图纸).rar

claude code接入本地ollama平台代理服务器

claude code接入本地ollama平台代理服务器

这是一个专门为 Ollama​ 本地大模型服务设计的 HTTP API 代理网关。它的核心功能是充当一个中间层,接收标准化的 AI 模型 API 请求,并将其转发到本地运行的 Ollama 服务。其最大特色是同时兼容 OpenAI 格式和 Anthropic (Claude) 格式的 API 请求,用户可以用它接入cc swithch,把claude code的信息传送到本地的ollama平台,使得原本为 OpenAI API 或 Claude API 开发的客户端、应用和工具,无需修改即可无缝连接到您本地的 Ollama 模型上运行。它有很好的扩展性,根据其他平台的接入协议,稍加修改,可以完成相应模型平台的代理服务。 使用说明: 环境:Python 3.13 Cc switch 3.16.1 Ollama 0.24.0 Claude code 2.1.158 步骤: 1、创建虚拟远程平台地址和端口,其中地址任意,端口为8321, http://xxx.xxx.xxx:8321; 2、设置映射,编辑本机的hosts文件,添加:127.0.0.1 xxx.xxx.xxx; 3、设置cc switch链接参数,其中请求地址必须与虚拟远程平台地址和端口一致:http://xxx.xxx.xxx:8321,默认兜底模型必须为本机ollama平台内已经安装成功的模型名称; 4、运行ollama和cc switch软件; 5、运行本服务器 6、打开系统终端,运行claude code 7、使用claude code终端与设置中模型对话

biTCH.rar

biTCH.rar

CAD缺少相关字体时,图纸中的文字会出现缺失或乱码。下载所需字体并复制到 AutoCAD 的 Fonts 文件夹后,即可正常显示。

Springboot毕业设计含文档和代码springbootnuct产品售后管理系统-论文

Springboot毕业设计含文档和代码springbootnuct产品售后管理系统-论文

Springboot毕业设计含文档和代码springbootnuct产品售后管理系统--论文

Croc 跨设备文件传输完整源码|Go 语言 P2P 局域网文件收发开发工程

Croc 跨设备文件传输完整源码|Go 语言 P2P 局域网文件收发开发工程

本资源为 Croc 开源传输工具完整源码压缩包,基于 Go 实现 P2P 跨平台文件传输,无需公网 IP,支持 Windows/Linux/macOS/Android 多端互传文件夹、单文件,依靠中继服务穿透内网。 1. 适用人群:运维工程师、后端 Go 开发者、工具类软件研发、跨端文件传输项目学习者; 2. 适用场景:办公设备互传资料、服务器本地文件分发、内网批量资源下发、自定义传输工具二次开发; 3. 配套内容:源码附带一键编译脚本、中继部署文档、多系统使用示例,规避 Github 下载限速,编译后即可生成可执行程序。

AI 导航是一个现代化的人工智能网站导航系统,致力于帮助用户发现、分享和管理优质的 AI 工具与资源。项目采用最新的 Web 技.zip

AI 导航是一个现代化的人工智能网站导航系统,致力于帮助用户发现、分享和管理优质的 AI 工具与资源。项目采用最新的 Web 技.zip

天天生鲜是传智播客黑马出品的python实战项目, 项目的[在线视频教程], 项目的讲义被放在了Python24期整套视频的讲义中的**第20章节**,具体的天天生鲜 [在线讲义查看],除了天天生鲜项目之外,传智播客&黑马出品的Python24期人工智能整套代码和讲义集合,项目…

全栈开发TypeScript类型系统与工程化实战:基于NestJS与React的端到端类型安全项目构建

全栈开发TypeScript类型系统与工程化实战:基于NestJS与React的端到端类型安全项目构建

内容概要:本文系统讲解了TypeScript类型系统与现代全栈项目工程化实践,涵盖从类型基础到高级特性的核心技术,包括原始类型、对象类型、函数类型、类型推导、结构化类型、类型收窄及泛型、条件类型、映射类型、模板字面量类型等高级类型机制,并结合React/Vue与NestJS/Express实现前后端一体化开发。通过类型驱动开发理念,构建类型安全的组件体系、状态管理、接口 DTO 设计、数据库模型映射及 Swagger 文档自动生成,确保端到端类型一致性。项目层面引入 Monorepo 架构(Nx/Turborepo)实现代码统一管理与类型共享,提升协作效率。工程化部分覆盖构建优化、代码规范、提交校验、CI/CD 自动化流程与 Docker 容器化部署,打造生产级应用能力。最终通过完整全栈项目(如任务系统、电商后台)实现能力闭环。; 适合人群:具备前端基础、有一定JavaScript/TypeScript经验,希望进阶工程化能力和全栈架构设计的1-3年开发者或中级工程师。; 使用场景及目标:①掌握TypeScript高级类型在实际项目中的工程化应用;②构建类型安全的前后端服务,提升系统稳定性和可维护性;③实践Monorepo架构与CI/CD流程,具备独立开发和部署中大型全栈项目的能力。; 阅读建议:学习过程中应结合代码实践,动手搭建项目结构,逐步实现类型定义复用、接口联调与自动化部署流程,注重类型与业务逻辑的深度结合,培养“类型即文档”的开发思维。

草履虫调试助手可定义曲线,支持 UART、TCP、UDP 等多种通信模式,附有多种小工具

草履虫调试助手可定义曲线,支持 UART、TCP、UDP 等多种通信模式,附有多种小工具

**草履虫调试助手** 是一款嵌入式/IoT 综合调试工具,支持 UART、TCP、UDP 等多种通信模式,集成数据收发、实时曲线绘图、HEX 视图、数据分窗等功能。 **UART 串口**:选择 COM 口和波特率(9600~1000000),点击"刷新"更新端口列表。 **TCP 客户端**:填写远程主机地址、远程端口、本地端口后连接。 **TCP 服务器**:填写本地端口,启动后自动显示本机 IP,状态栏显示客户端数量。 **UDP**:填写远程主机地址和端口即可收发。

最新推荐最新推荐

recommend-type

PyPI 官网下载 | mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl

资源来自pypi官网,解压后可用。 资源全名:mlpack3-3.4.2-cp36-cp36m-manylinux1_x86_64.whl
recommend-type

实现基于C++或者python基本库,初学学习之用.zip

人工智能-项目实践-机器学习
recommend-type

机器学习的一些基础算法,主要使用Python、Cpp、Matlab编写。.zip

matlab算法,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。
recommend-type

jenkins-conf:Jenkins的配置文件

mlpack Jenkins配置和测试支持 该存储库包含Jenkins( )使用的许多脚本,用于构建和测试mlpack。
recommend-type

学生成绩管理系统C++课程设计与实践

资源摘要信息:"学生成绩信息管理系统-C++(1).doc" 1. 系统需求分析与设计 在进行学生成绩信息管理系统开发前,首先需要进行系统需求分析,这是确定系统开发目标与范围的过程。需求分析应包括数据需求和功能需求两个方面。 - 数据需求分析: - 学生成绩信息:需要收集学生的姓名、学号、课程成绩等数据。 - 数据类型和长度:明确每个数据项的数据类型(如字符串、整型等)和长度,例如学号可能是字符串类型且长度为一定值。 - 描述:详细描述每个数据项的意义,以确保系统能够准确处理。 - 功能需求分析: - 列出功能列表:用户界面应提供清晰的操作指引,列出所有可用功能。 - 查询学生成绩:系统应能通过学号或姓名查询学生的成绩信息。 - 增加学生成绩信息:允许用户添加未保存的学生成绩信息。 - 删除学生成绩信息:能够通过学号或姓名删除已经保存的成绩信息。 - 修改学生成绩信息:通过学号或姓名修改已有的成绩记录。 - 退出程序:提供安全退出程序的选项,并确保所有修改都已保存。 2. 系统设计 系统设计阶段主要完成内存数据结构设计、数据文件设计、代码设计、输入输出设计、用户界面设计和处理过程设计。 - 内存数据结构设计: - 使用链表结构组织内存中的数据,便于动态增删查改操作。 - 数据文件设计: - 选择文本文件存储数据,便于查看和编辑。 - 代码设计: - 根据功能需求,编写相应的函数和模块。 - 输入输出设计: - 设计简洁明了的输入输出提示信息和操作流程。 - 用户界面设计: - 用户界面应为字符界面,方便在命令行环境下使用。 - 处理过程设计: - 设计数据处理流程,确保每个操作都有明确的处理逻辑。 3. 系统实现与测试 实现阶段需要根据设计阶段的成果编写程序代码,并进行系统测试。 - 程序编写: - 完成系统设计中所有功能的程序代码编写。 - 系统测试: - 设计测试用例,通过测试用例上机测试系统。 - 记录测试方法和测试结果,确保系统稳定可靠。 4. 设计报告撰写 最后,根据系统开发的各个阶段,撰写详细的设计报告。 - 系统描述:包括问题说明、数据需求和功能需求。 - 系统设计:详细记录内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。 - 系统测试:包括测试用例描述、测试方法和测试结果。 - 设计特点、不足、收获和体会:反思整个开发过程,总结经验和教训。 时间安排: - 第19周(7月12日至7月16日)完成项目。 - 7月9日8:00到计算机学院实验中心(三楼)提交程序和课程设计报告。 指导教师和系主任(或责任教师)需要在文档上签名确认。 系统需求分析: - 使用表格记录系统需求分析的结果,包括数据项、数据类型、数据长度和描述。 - 分析数据项如学生成绩信息、状态器、链表节点等,确定其属性和行为。 以上就是文档中提到的学生成绩信息管理系统开发的关键知识点。开发此类系统需要熟练掌握C++编程基础,了解面向对象的程序设计思想,以及熟悉文件操作和链表等数据结构的应用。此外,良好的软件开发流程意识、测试意识和文档撰写能力也是必不可少的。
recommend-type

别再手动拖拽了!用Lumerical脚本批量创建FDTD仿真结构(附完整代码)

# 告别低效建模:Lumerical脚本自动化实战指南 在光子学仿真领域,时间就是科研生命线。当同行还在GUI界面里反复点击菜单时,你已经用脚本批量生成了20组参数化结构——这不是未来场景,而是每位FDTD用户都应该掌握的基础生产力革命。本文将彻底改变你与Lumerical的交互方式,从手动拖拽的农耕时代,跃迁到自动化建模的工业文明。 ## 1. 为何脚本建模是必然选择 2019年Nature Photonics的一项研究显示,科研工作者在仿真工具上平均浪费37%的时间在重复性操作上。对于需要参数扫描的纳米光学结构设计,这个数字可能更高。手动创建10个不同尺寸的纳米柱阵列意味着: -
recommend-type

Java邮件解析任务中,如何安全高效地提取HTML邮件内容并避免硬编码、资源泄漏和类型转换异常?

<think>我们被要求优化一段Java代码,该代码用于处理邮件(特别是来自特定发件人的构建通知邮件)。代码的主要问题包括: 1. 重复获取邮件内容:在检查MIME类型后,多次调用`msg[i].getContent()`,这可能导致性能问题或流关闭异常。 2. 类型转换问题:直接将邮件内容转换为`Multipart`而不进行类型检查,可能引发`ClassCastException`。 3. 代码结构问题:逻辑嵌套过深,可读性差,且存在重复代码(如插入邮件详情的操作在两个地方都有)。 4. 硬编码和魔法值:例如在解析HTML表格时使用了硬编码的索引(如list3.get(10)),这容易因邮件
recommend-type

RH公司应收账款管理优化策略研究

资源摘要信息:"本文针对RH公司的应收账款管理问题进行了深入研究,并提出了改进策略。文章首先分析了应收账款在企业管理中的重要性,指出其对于提高企业竞争力、扩大销售和充分利用生产能力的作用。然后,以RH公司为例,探讨了公司应收账款管理的现状,并识别出合同管理、客户信用调查等方面的不足。在此基础上,文章提出了一系列改善措施,包括完善信用政策、改进业务流程、加强信用调查和提高账款回收力度。特别强调了建立专门的应收账款回收部门和流程的重要性,并建议在实际应用过程中进行持续优化。同时,文章也意识到企业面临复杂多变的内外部环境,因此提出的策略需要根据具体情况调整和优化。 针对财务管理领域的专业学生和从业者,本文提供了一个关于应收账款管理问题的案例研究,具有实际指导意义。文章还探讨了信用管理和征信体系在应收账款管理中的作用,强调了它们对于提升企业信用风险控制和市场竞争能力的重要性。通过对比国内外企业在应收账款管理上的差异,文章总结了适合中国企业实际环境的应收账款管理方法和策略。" 根据提供的文件内容,以下是详细的知识点: 1. 应收账款管理的重要性:应收账款作为企业的一项重要资产,其有效管理关系到企业的现金流、财务健康以及市场竞争力。不良的应收账款管理会导致资金链断裂、坏账损失增加等问题,严重影响企业的正常运营和长远发展。 2. 应收账款的信用风险:在信用交易日益频繁的商业环境中,企业必须对客户信用进行评估,以便采取合理的信用政策,降低信用风险。 3. 合同管理的薄弱环节:合同是应收账款管理的法律基础,严格的合同管理能够保障企业权益,减少因合同问题导致的应收账款风险。 4. 客户信用调查:了解客户的信用状况对于预测和控制应收账款风险至关重要。企业需要建立有效的客户信用调查机制,识别和筛选信用良好的客户。 5. 应收账款回收策略:企业应建立有效的账款回收机制,包括定期的账款跟进、逾期账款的催收等。同时,建立专门的应收账款回收部门可以提升回收效率。 6. 应收账款管理流程优化:通过改进企业内部管理流程,如简化审批流程、提高工作效率等措施,能够提升应收账款的管理效率。 7. 应收账款管理策略的调整和优化:由于企业的内外部环境复杂多变,因此制定的管理策略需要根据实际情况进行动态调整和持续优化。 8. 信用管理和征信体系的作用:建立和完善企业内部信用管理体系和征信体系,有助于企业更好地控制信用风险,并在市场竞争中占据有利地位。 9. 对比国内外应收账款管理实践:通过研究国内外企业在应收账款管理上的不同做法和经验,可以借鉴先进的管理理念和方法,提升国内企业的应收账款管理水平。 综上所述,本文深入探讨了应收账款管理的多个方面,为RH公司乃至其他同类型企业提供了应收账款管理的改进方向和策略,对于财务管理专业的教育和实践都具有重要的参考价值。
recommend-type

新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构

# 新手别慌!用BingPi-M2开发板带你5分钟搞懂Tina Linux SDK目录结构 第一次拿到BingPi-M2开发板时,面对Tina Linux SDK里密密麻麻的文件夹,我完全不知道从哪下手。就像走进一个陌生的大仓库,每个货架上都堆满了工具和零件,却找不到操作手册。这种困惑持续了整整两天,直到我意识到——理解目录结构比死记硬背每个文件更重要。 ## 1. 为什么SDK目录结构如此重要 想象你正在组装一台复杂的模型飞机。如果所有零件都混在一个箱子里,你需要花大量时间寻找每个螺丝和面板。但如果有分门别类的隔层,标注着"机身部件"、"电子设备"、"紧固件",组装效率会成倍提升。Ti
recommend-type

Java线程池运行时状态怎么实时掌握?有哪些靠谱的监控手段?

<think>我们之前已经讨论过Java线程池监控的多种方法,包括使用第三方工具和自定义监控。现在用户再次询问Java线程池监控方法,我们需要根据引用内容以及之前讨论的内容进行总结和扩展。 引用[1]提到使用JDK自带的监控工具,引用[2]提到了三种常用的线程池创建方式,引用[3]给出了通过ThreadPoolExecutor获取线程池状态的方法。 结合之前回答的内容,我们可以将监控方法分为以下几类: 1. 使用JDK自带工具(如jconsole, jvisualvm)进行监控。 2. 通过编程方式获取线程池状态(如引用[3]所示)。 3. 扩展ThreadPoolExecutor,