识码 — 二维码识别与链接提取
从图片中识别二维码并输出其内容(通常是分享链接,如夸克/百度网盘等)。
触发方式(主触发词:识码)
- 「识码」+ 图片 ← 顺口首选,两字即达
- 「扫码」「扫一下」「识别这个二维码,给我链接」← 同义别名,均可触发
- 直接粘贴/拖入二维码截图(无需任何说明,自动识别)
运行环境(重要:用装了 opencv-contrib 的专用环境)
系统 Python 或通用环境里可能只有残缺的 cv2(import cv2 成功但 imread 不存在,会被误判为"可用")。
先自检,能打印出版本号才可用:
<python> -c "import cv2; print(cv2.__version__)"
若报错或没有版本号,建一个专用虚拟环境再跑(下文 <skill_dir> = 本技能所在目录,<venv> = 你自选的虚拟环境路径):
<python> -m venv "<venv>"
"<venv>/bin/python" -m pip install -r "<skill_dir>/requirements.txt" # Windows: "<venv>\Scripts\python.exe"
依赖清单见本技能根目录 requirements.txt(opencv-contrib-python-headless / numpy / pillow)。
标准用法
PYTHONIOENCODING=utf-8 "<venv>/bin/python" "<skill_dir>/scripts/decode_qr.py" "<图片绝对路径>"
> Windows 下 "<venv>/bin/python" 换成 "<venv>\Scripts\python.exe"。
Windows 下必须带 PYTHONIOENCODING=utf-8,否则中文输出在 GBK 控制台乱码/报错。
解码策略(脚本已内置)
- 全图直接解码 — 适用于整张图就是二维码的场景,命中率最高。
- 定位白色二维码块再裁剪 — 通过阈值 + 轮廓找最大近正方白色区域,适用于卡片式弹出框截图(二维码只占画面一部分)。
- 放大 + 二值化 + 中值滤波 — 针对渐变填充、圆点(dot-style)、低对比度等"美化二维码",用 2/3/4 倍上采样 + Otsu/自适应阈值 + medianBlur 消除圆点间隙。
同时使用两个检测器:cv2.QRCodeDetector(标准)与 cv2.wechat_qrcode_WeChatQRCode(微信引擎,对美化码更鲁棒)。前者在 opencv-python 即可用,后者需 opencv-contrib。
输出规范
- 直接给出识别到的完整链接原文(含
?pwd=等查询参数,不要截断、不要改写 host)。 - 若图中另有"提取码"文字,核对与链接
pwd参数是否一致,不一致需提示用户。 - 多策略若解出不同结果,全部列出并提示存在歧义;结果一致则只输出一条。
已知坑
default/ 其他既有 venv 里的cv2是空壳,务必用qrdecode环境。- pyzbar 需要系统级 zbar DLL,Windows 上常缺失,本技能不依赖它。
- 圆点样式二维码必须先做去圆点处理(medianBlur)再二值化,直接 Otsu 往往失败。
版本说明
- 1.0.2(2026-10-20):输出增加 UTF-8 编码兜底;随包补
LICENSE.txt。已在 OpenCV 5.0.0 实测解码正常。功能与 1.0.1 一致。