十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

机器视觉选型三件套:镜头计算器+离线知识库+本地方案

机器视觉选型三件套:镜头计算器+离线知识库+本地方案 在机器视觉项目里最容易被低估的不是算法而是选型。很多团队辛苦做完了算法验证一到搭建硬件方案时才发现相机靶面、镜头焦距、工作距离根本没有匹配上最后只能推翻重来。镜头焦距差几毫米、视野差几个厘米都会直接影响检测精度和项目交付。本文围绕启视QVis V0.2 的定位展开重点拆解它提出的“镜头计算器 离线知识库 本地方案”三件套组合适合正在做视觉选型、方案评估、以及想搭建本地工具链的工程师阅读。通过文章你会理解每一件套背后解决什么问题并拿到一套可以落地的最小实现示例。1. 背景与核心概念1.1 为什么视觉选型让人头疼视觉选型通常发生在项目方案阶段。需求方只给一个检测精度要求比如“检测 0.5mm 的缺陷”“视野 200mm 内识别字符”剩下的所有硬件参数都需要视觉工程师自己推导。推导过程涉及相机分辨率、芯片靶面尺寸、镜头焦距、工作距离、景深、光源波长等一系列参数任何一个参数算错都会导致最终方案不可用。更麻烦的是这些参数之间是耦合的。焦距变了视野就变工作距离变了景深和放大倍率又跟着变。再加上不同品牌的相机、镜头型号非常多手册参数各不相同工程师通常需要在多个文档、多个在线工具之间来回切换效率很低。很多小型自动化公司甚至没有专职视觉工程师往往是电气工程师兼顾选型只能靠供应商推荐项目风险自然就上来了。1.2 启视QVis V0.2 是什么启视QVis V0.2 可以理解为一套面向视觉选型场景的本地工具集。它从实际选型流程出发把选型过程中最高频的三个需求打包在一起镜头计算器把焦距、视野、工作距离、分辨率之间的换算关系固化下来输入参数即可得到推荐结果。离线知识库把镜头型号、相机参数、光源类型、案例经验等内容沉淀到本地数据库支持快速检索不需要联网。本地方案数据、服务、页面都在本地运行不依赖外部服务器适合研发内网甚至完全离线的生产环境。相比在线选型工具QVis 这类本地化方案最大的特点是可控。选型数据不会离开内网知识库可以按项目组自由维护工具本身也可以离线使用不受网络波动影响。1.3 “三件套”分别解决什么问题第一镜头计算器解决的是“算得准”的问题。有了标准算法不同工程师算出来的结果是一致的不会因为经验差异导致方案差异。第二离线知识库解决的是“找得到”的问题。视觉选型非常依赖历史经验和供应商资料。一个项目用过的镜头型号、一个验证过的参数组合如果散落在聊天记录和本地文件里下次很难找回来。知识库把这些问题集中管理。第三本地方案解决的是“用得上”的问题。很多工厂环境不允许访问外部网络在线工具完全不可用。本地部署让工具真正跑到用户手里不依赖外网权限。1.4 适用读者本文适合以下几类读者刚接触机器视觉想系统理解选型参数关系的初学者。需要频繁给项目做硬件方案、做技术验证的视觉工程师。团队内部想搭建选型工具链但没有现成方案可以参考的技术负责人。对本地部署、离线工具感兴趣的开发者。读完本文你将掌握镜头选型的核心公式了解离线知识库的常见实现方式并且可以跟着章节动手搭一个最小可运行的视觉选型辅助工具。2. 环境准备与项目结构2.1 运行环境本文的示例代码以 Python 为基础主要依赖 Flask 和 SQLite。Python 版本建议使用 3.9 及以上版本因为新版类型注解和内置语法更友好。操作系统方面Windows、Linux、macOS 都可以运行本文示例在 Windows 10/11 下验证过思路但命令本身是跨平台的。需要说明的是QVis V0.2 是不断迭代的版本项目本文不虚构其内部源码而是从其功能定位出发用通用技术栈实现一个功能等价的最小示例。读者可以借此理解工具背后的设计逻辑再迁移到自己的工程里。2.2 依赖安装示例项目只需要安装 Flask 一个第三方库SQLite 由 Python 标准库直接支持。pip install flask如果希望顺带做图像的简单验证可以再安装pip install opencv-python-headless numpyopencv-python-headless 是 OpenCV 的无界面版本适合在没有显示器的服务器或本地脚本里使用避免安装桌面依赖。2.3 推荐目录结构一个功能清晰的小工具建议按职责拆分目录避免把所有逻辑塞进一个文件。本文示例的目录结构如下qvis-mini/ ├── app.py # Flask 主入口负责路由 ├── lens_calc.py # 镜头计算核心逻辑 ├── kb.py # 离线知识库的初始化和查询 ├── requirements.txt # 依赖清单 ├── data/ │ └── lens.db # SQLite 数据库文件首次运行自动生成 └── templates/ └── index.html # 浏览器页面模板创建目录和文件可以手动完成也可以用命令快速生成。Windows 下创建多级目录mkdir qvis-mini cd qvis-mini mkdir data templates3. 镜头计算器把选型公式变成可复用工具3.1 镜头计算的基本原理镜头选型中最常用的一组公式核心是把工作距离WD、传感器靶面宽度SW、视野宽度FOV、焦距f联系起来。最基础的计算公式是f WD × SW / FOV其中f 为焦距单位 mm。WD 为镜头前端到被测物体的工作距离单位 mm。SW 为相机传感器靶面的物理宽度单位 mm。FOV 为对应视野宽度单位 mm。举一个例子。假设某相机传感器靶面宽度为 4.8mm工作距离需要 200mm视野宽度要求 100mm那么f 200 × 4.8 / 100 9.6mm所以选择 10mm 附近的定焦镜头比较合理。这个公式的逻辑很多人知道但实际选型时换算单位、反推视野、判断分辨率是否满足要求每一步都容易出错。尤其是不同品牌传感器型号的靶面尺寸不一样查表时稍不注意就会把 1/2.5 英寸的靶面当成 1/2 英寸来算。3.2 核心函数实现下面用 Python 实现一个最小可用的镜头计算模块。文件路径为lens_calc.py。# 文件路径qvis-mini/lens_calc.py def calc_focal_length(working_distance, sensor_width, fov_width): 根据工作距离、传感器靶面宽度、视野宽度计算推荐焦距。 :param working_distance: 工作距离单位 mm :param sensor_width: 传感器靶面宽度单位 mm :param fov_width: 视野宽度单位 mm :return: 推荐焦距单位 mm if fov_width 0: raise ValueError(视野宽度必须大于 0) if sensor_width 0: raise ValueError(传感器靶面宽度必须大于 0) if working_distance 0: raise ValueError(工作距离必须大于 0) focal_length working_distance * sensor_width / fov_width return focal_length def calc_fov(working_distance, sensor_width, focal_length): 根据工作距离、传感器靶面宽度、焦距计算视野宽度。 if focal_length 0: raise ValueError(焦距必须大于 0) fov_width working_distance * sensor_width / focal_length return fov_width def calc_min_resolution(fov_width, sensor_width, pixel_size_um): 计算在当前视野下单个像素对应的物方尺寸。 :param fov_width: 视野宽度单位 mm :param sensor_width: 传感器靶面宽度单位 mm :param pixel_size_um: 像元尺寸单位 um :return: 物方单像素精度单位 mm if sensor_width 0 or fov_width 0 or pixel_size_um 0: raise ValueError(传感器宽度、视野宽度、像元尺寸都必须大于 0) pixel_size_mm pixel_size_um / 1000.0 resolution fov_width * pixel_size_mm / sensor_width return resolution if __name__ __main__: # 简单自测 f calc_focal_length(200, 4.8, 100) print(推荐焦距: {:.2f}mm.format(f)) resolution calc_min_resolution(100, 4.8, 2.4) print(物方单像素精度: {:.4f}mm.format(resolution))这段代码里做了三个事情用calc_focal_length算出推荐焦距用calc_fov反推视野适合已有镜头验证方案用calc_min_resolution判断所选组合的极限分辨率。跑一下自测代码输出效果如下推荐焦距: 9.60mm 物方单像素精度: 0.0500mm3.3 参数边界说明实际工程中镜头选型不能只看一个焦距值。还要关注接口类型C 口、CS 口、靶面尺寸覆盖镜头像面必须大于等于传感器靶面、畸变率、工作距离范围、景深等参数。尤其需要注意的是厂家标称的焦距往往是整档值比如 8mm、12mm、16mm。计算结果是 9.6mm 时工业上通常就近选择 8mm 或 12mm再通过调整工作距离来适配视野要求。调整工作距离后需要重新验算视野和景深不能只看焦距。3.4 从计算到选型计算只是第一步。真正选型时建议按下面的顺序确认先确认检测精度要求计算所需最小分辨率。再确认视野和工作距离的物理限制。计算焦距选最接近的镜头档位。查镜头支持的靶面尺寸和接口。验算景深是否满足要求。最后做实际打光测试。QVis V0.2 的镜头计算器本质上就是把前四步标准化减少人工查表和换算的时间。4. 离线知识库让选型经验沉淀在本地4.1 离线知识库的功能定位视觉选型过程中工程师需要查询大量型号参数。常见的场景包括某个物距下常用的 500 万像素相机配什么镜头之前项目里用过哪款光源色温是多少某个供应商的镜头型号具体靶面覆盖范围是多少这些信息如果靠记忆容易遗忘如果靠翻聊天记录效率太低。离线知识库就是为了解决这类问题。离线有两个关键含义数据存储在本地不依赖外部 API检索能力在本机完成不会把数据发送到第三方服务器。对很多做设备研发的团队来说离线知识库还承担着团队经验沉淀的职能。新人入职后不需要反复问老员工“这个项目怎么选的”直接搜知识库就能拿到历史方案上下文。4.2 技术选型离线知识库的技术方案比较灵活常见选择有三类。第一类是传统关系型数据库加模糊查询比如 SQLite、MySQL。优点是结构清晰适合参数化的数据比如镜头焦距、靶面尺寸、接口类型。缺点是全文检索能力偏弱like 查询在数据量大时性能一般。第二类是全文检索引擎比如 SQLite FTS5、Apache Lucene。它可以对文本内容建立倒排索引搜索响应快适合搜索产品描述、案例记录等长文本。第三类是嵌入式向量数据库比如 Chroma、SQLite-Vec。适合做语义检索比如输入“大视野低畸变”能找到相关镜头型号。但向量库的维护成本更高需要做向量化对纯离线工具来说初期不必上这一套。QVis V0.2 的离线知识库从“离线、轻量、易维护”的角度出发选用 SQLite 加 FTS5 是性价比比较高的方案。4.3 基于 SQLite FTS5 的实现下面代码实现知识库初始化、写入示例数据和查询。文件路径为kb.py。# 文件路径qvis-mini/kb.py import sqlite3 import os DB_PATH data/lens.db def get_connection(): # 确保 data 目录存在 os.makedirs(os.path.dirname(DB_PATH), exist_okTrue) return sqlite3.connect(DB_PATH) def init_db(): 初始化数据库创建 FTS5 虚拟表。 如果表已经存在则不重复创建。 conn get_connection() conn.execute( CREATE VIRTUAL TABLE IF NOT EXISTS lens_kb USING fts5( name, spec, category, content ) ) conn.commit() conn.close() def insert_sample_data(): 写入演示数据方便直接运行测试。 实际使用中可以替换为自己的型号库和案例库。 init_db() conn get_connection() sample_data [ (FA2514, 25mm 2/3\, 定焦镜头, 常用 2/3 英寸靶面工业镜头适合中小视野检测工作距离可调范围较大。), (LM50HC, 50mm 1\, 定焦镜头, 适用于大靶面相机低畸变设计适合高精度测量场景。), (MV-CA050-10GM, 500万像素 2/3\, 工业相机, 500 万像素千兆网相机像元尺寸 3.45um适合通用视觉检测。), (RL-120-100W, 100W 红色环形光源, 光源, 红色光源适合透射或表面纹理检测环形结构适合打光均匀的场景。), ] conn.executemany( INSERT INTO lens_kb(name, spec, category, content) VALUES (?, ?, ?, ?) , sample_data, ) conn.commit() conn.close() def search_kb(keyword): 在知识库中检索关键词。 返回结果列表每个元素是 (name, spec, category, content)。 init_db() conn get_connection() cursor conn.execute( SELECT name, spec, category, content FROM lens_kb WHERE lens_kb MATCH ? , (keyword,), ) rows cursor.fetchall() conn.close() return rows if __name__ __main__: init_db() insert_sample_data() results search_kb(镜头) for row in results: print(row)运行这段脚本前如果之前已经生成过数据库文件建议先删掉旧的data/lens.db再跑避免数据重复插入。python kb.py预期输出类似(FA2514, 25mm 2/3, 定焦镜头, 常用 2/3 英寸靶面工业镜头...) (LM50HC, 50mm 1, 定焦镜头, 适用于大靶面相机...)4.4 中文检索的注意事项SQLite FTS5 默认的 unicode61 分词器对中文支持不理想它会把连续的中文字符当作一个整词。直接搜“镜头”可能匹配不到包含“工业镜头”的结果体验会比较差。实际工程中有几个改进方向把关键词拆成短词再匹配比如对中文内容做简单的人工空格分词。增加一列“别名”提前写入常见检索词。使用支持中文分词的扩展库如 simple 分词器配合空格预处理。先做宽泛匹配再做二次过滤。在最小示例中可以先通过在插入数据时给content字段加空格分词的方式优化。def tokenize_chinese(text): return .join(text)当然这种方式比较粗糙生产环境建议做真正的分词处理至少要把连续中文按字或按词切分。5. 本地方案内网可用、数据可控5.1 本地方案的价值很多团队会优先选择在线选型工具但一进入工厂现场就发现网络策略非常严格。研发网和生产网隔离外部网站根本访问不了。这种情况下本地化方案的优势就体现出来了。本地方案的价值主要体现在三点离线可用没有外网也能正常计算和检索。数据可控所有历史方案和选型数据都在内网不担心数据外泄。可持续沉淀团队成员可以把项目经验不断补充到本地知识库中。业界其实已经有这种趋势很多基础组件都在从纯在线服务走向本地部署方案比如一些定时调度平台也在完善离线部署能力。QVis V0.2 强调本地方案本质上和这一趋势是一致的。5.2 本地服务架构一个轻量级本地工具通常由 Web 页面、本地 API 服务和本地数据库三部分组成。浏览器页面 -- Flask API -- SQLite 数据库浏览器承担交互界面Flask 承担计算和检索逻辑SQLite 承担数据存储。三部分完全跑在本地不需要外部中间件部署和维护成本都很低。如果需要在局域网内多人使用只需把 Flask 服务的 host 设置为0.0.0.0同事通过 IP 加端口访问即可。如果需要更强的稳定性和并发能力可以在前面加一层 Nginx。5.3 一个最小 Flask 服务示例下面用一个极简 Flask 服务演示本地 API 的编写方式。文件路径为app.py。# 文件路径qvis-mini/app.py from flask import Flask, render_template, request, jsonify from lens_calc import calc_focal_length, calc_fov, calc_min_resolution from kb import init_db, insert_sample_data, search_kb app Flask(__name__) app.route(/, methods[GET]) def index(): return render_template(index.html) app.route(/calc_focal, methods[POST]) def calc_focal(): 计算焦距。 请求参数: working_distance, sensor_width, fov_width try: working_distance float(request.form.get(working_distance)) sensor_width float(request.form.get(sensor_width)) fov_width float(request.form.get(fov_width)) focal calc_focal_length(working_distance, sensor_width, fov_width) return jsonify({focal_length: round(focal, 2)}) except ValueError as e: return jsonify({error: str(e)}), 400 except Exception: return jsonify({error: 请求参数格式不正确}), 400 app.route(/search, methods[POST]) def search(): 知识库检索。 请求参数: keyword keyword request.form.get(keyword, ).strip() if not keyword: return jsonify({error: 关键词不能为空}), 400 rows search_kb(keyword) results [ { name: row[0], spec: row[1], category: row[2], content: row[3], } for row in rows ] return jsonify({results: results}) if __name__ __main__: init_db() insert_sample_data() app.run(host0.0.0.0, port5000, debugTrue)这里用request.form接收 POST 表单参数逻辑简单直接。debugTrue只适合开发调试生产环境要关闭。5.4 浏览器访问与内网分发运行程序python app.py浏览器访问http://localhost:5000如果局域网内需要多人使用查看本机 IPipconfig然后其他人访问http://192.168.x.x:5000注意 Windows 防火墙可能拦截访问需要在防火墙入站规则中放行 5000 端口或者在部署文档里明确写上网关和端口变更方式。6. 完整实战搭建 QVis 风格的最小视觉选型工具6.1 需求与功能拆分现在我们综合前面几个模块搭一个最小版本的工具取名为 qvis-mini。它的功能很简单页面提供表单输入可以计算焦距。页面提供搜索框可以检索本地知识库。计算结果和检索结果都在当前页面展示。这个工具虽然在规模上远小于完整的 QVis V0.2但已经把“镜头计算器 离线知识库 本地方案”三条核心链路打通了。6.2 项目文件规划继续沿用前面的目录结构qvis-mini/ ├── app.py ├── lens_calc.py ├── kb.py ├── requirements.txt ├── data/ │ └── lens.db └── templates/ └── index.html6.3 镜头计算模块代码该模块已经在 3.2 节给出文件路径为lens_calc.py。直接复用即可。6.4 知识库模块代码该模块已经在 4.3 节给出文件路径为kb.py。注意首次运行时调用insert_sample_data()是演示行为真实项目中应改为管理端导入数据。6.5 主应用代码主应用代码已经在 5.3 节给出文件路径为app.py。可以额外扩展一个/calc_fov接口方便测试不同镜头组合下的视野变化。app.route(/calc_fov, methods[POST]) def calc_fov_api(): try: working_distance float(request.form.get(working_distance)) sensor_width float(request.form.get(sensor_width)) focal_length float(request.form.get(focal_length)) fov calc_fov(working_distance, sensor_width, focal_length) return jsonify({fov_width: round(fov, 2)}) except ValueError as e: return jsonify({error: str(e)}), 400 except Exception: return jsonify({error: 请求参数格式不正确}), 4006.6 前端页面文件路径为templates/index.html。页面保持简洁包含输入端、焦距结果区和知识库检索区。!DOCTYPE html html langzh-CN head meta charsetUTF-8 titleqvis-mini 视觉选型辅助工具/title style body { max-width: 800px; margin: 40px auto; font-family: Arial, sans-serif; } .card { border: 1px solid #ddd; border-radius: 8px; padding: 20px; margin-bottom: 20px; } label { display: inline-block; width: 140px; } input { padding: 6px; width: 200px; margin: 4px 0; } button { padding: 8px 20px; margin-top: 10px; } .result { margin-top: 10px; color: #1a73e8; } ul { list-style: none; padding: 0; } li { border-bottom: 1px solid #eee; padding: 8px 0; } /style /head body h1视觉选型辅助工具/h1 div classcard h3镜头计算器/h3 form idcalcForm label工作距离 WD(mm)/label input typenumber idworking_distance value200 step0.01br label传感器靶面宽度 SW(mm)/label input typenumber idsensor_width value4.8 step0.01br label视野宽度 FOV(mm)/label input typenumber idfov_width value100 step0.01br button typebutton onclickcalcFocal()计算焦距/button div classresult idfocalResult/div /form /div div classcard h3离线知识库检索/h3 form idsearchForm label关键词/label input typetext idkeyword value镜头 button typebutton onclicksearchKb()搜索/button /form ul idsearchResult/ul /div script async function calcFocal() { const formData new FormData(); formData.append(working_distance, document.getElementById(working_distance).value); formData.append(sensor_width, document.getElementById(sensor_width).value); formData.append(fov_width, document.getElementById(fov_width).value); const resp await fetch(/calc_focal, { method: POST, body: formData }); const data await resp.json(); if (data.error) { document.getElementById(focalResult).innerText 错误 data.error; } else { document.getElementById(focalResult).innerText 推荐焦距 data.focal_length mm; } } async function searchKb() { const formData new FormData(); formData.append(keyword, document.getElementById(keyword).value); const resp await fetch(/search, { method: POST, body: formData }); const data await resp.json(); const list document.getElementById(searchResult); list.innerHTML ; if (data.error) { list.innerHTML li错误 data.error /li; return; } if (data.results.length 0) { list.innerHTML li没有匹配结果/li; return; } data.results.forEach(item { const li document.createElement(li); li.innerHTML b item.name /b | item.spec | item.category br item.content; list.appendChild(li); }); } /script /body /html6.7 运行与验证在项目根目录执行python app.py浏览器访问http://localhost:5000输入工作距离 200mm、传感器宽度 4.8mm、视野宽度 100mm点击计算页面会显示“推荐焦距9.6 mm”。在知识库搜索框输入“镜头”点击搜索页面会返回示例数据中所有包含“镜头”的记录。前端展示、后端计算、本地数据库三条链路都完成了验证。7. 常见问题与排查思路7.1 常见问题速查表问题现象常见原因解决思路计算焦距报错输入了 0 或负数的视野、距离在接口和前端同时增加参数校验搜索“镜头”没结果FTS5 默认分词对中文不友好对中文内容做空格预处理或维护别名页面无法打开Flask 端口被占用或没启动成功查看命令行日志换端口后重试局域网同事访问不到Windows 防火墙未放行端口增加入站规则放行 5000 端口数据库插入重复数据每次启动都执行insert_sample_data()增加幂等判断或把初始化与业务写入分离计算值与厂家选型软件不一致传感器靶面宽度取错或单位换算问题重新核对相机规格书确认 mm 单位7.2 深入排查焦距计算结果偏差很大这种情况最常见的原因是传感器靶面宽度取错。相机的规格书里经常标注“1/2.5 英寸”但它不等于实际靶面尺寸。不同品牌、不同型号的 1/2.5 英寸传感器实际靶面宽度可能略有不同必须查到具体型号的 datasheet。推荐做法是写一个传感器型号表把常用靶面尺寸提前维护到知识库里。7.3 深入排查中文搜索无效如果使用 FTS5 默认分词器搜索词必须和表内分词结果匹配。解决方案是在写入数据时做简单分词例如把“常用 2/3 英寸靶面工业镜头”拆成“常用 2/3 英寸靶面工业镜头”让每个词独立建索引。更彻底的方式是引入中文分词扩展或更换为支持中文分词的存储方案。7.4 深入排查服务启动后端口占用Windows 下可以通过命令查看端口占用进程netstat -ano | findstr :5000拿到 PID 后通过任务管理器结束进程或者换一个端口启动应用。Flask 支持动态指定端口python app.py --port 50018. 最佳实践与工程建议8.1 数据规范要前置离线知识库的价值取决于数据质量。建议在初始化表结构时就定义统一的字段规范比如型号、规格、分类、来源、更新时间、实验环境备注。如果一开始只存一个描述字段后期检索和统计都会非常困难。8.2 计算模块要保留边界校验镜头计算虽然公式简单但不代表可以随便输入。视野为 0、传感器宽度为负数、焦距为 0都会导致结果无意义。生产环境不能只靠前端校验后端接口也必须做校验防止其他程序调用时产生脏数据。8.3 知识库需要版本和来源字段选型数据有一个容易被忽视的问题型号更新快老型号可能停产新型号参数可能变化。知识库中的数据最好标注来源和更新时间比如“供应商 2024 年规格书”。这样即使数据失效也有追溯条件。8.4 本地化交付要考虑部署细节本地方案看似简单但部署细节很多。建议提前做好以下几点把所有依赖生成requirements.txt锁定版本。数据库文件路径不要写死绝对路径要兼容相对路径。页面静态资源尽量内嵌或随包分发避免离线环境加载失败。如果需要打包成可执行程序可使用 PyInstaller 等工具同时注意数据和模板文件的打包路径。8.5 权限和数据安全要提前规划虽然工具部署在内网但并不意味着不需要权限控制。多人使用时至少考虑以下几个问题知识库的写入操作是否允许所有人执行能否在管理端导入新数据在普通端只读查询如果工具部署在服务器上是否需要配置登录页面数据库备份策略是什么多久做一次备份视觉选型工具承载的数据本质上是团队的项目经验积累。经验数据丢失比个人记忆丢失更难恢复定期备份是必须的。9. 总结视觉选型的本质是在一个多变量约束下找到可行解。QVis V0.2 提出的“镜头计算器 离线知识库 本地方案”三件套恰好覆盖了计算、查资料、场景落地三个环节。镜头计算器让参数换算不再依赖个人经验离线知识库让历史选型方案可以沉淀和复用本地方案则保证了工具在隔离网络中依然可用。本文用 Python、Flask、SQLite 实现了一个最小示例虽然代码量不大但完整走通了从镜头计算到知识检索、再到本地服务启动的整条链路。建议你动手跑一遍然后把示例中的演示数据替换成自己项目里的真实型号和案例。这样再遇到新的视觉项目时你的选型过程会顺畅很多。
返回列表