ROS2上使用WeChatQRdetector扫码二维码
微信的扫码算法对机器人在运动过程中产生的模糊、畸变有极强的识别率。ROS 2 社区有基于 OpenCV 编译的wechat_qrcode节点。功能包推荐ros2_wechat_qrcode或自行编写节点调用 OpenCV 的wechat_qrcode模块。工作流摄像头驱动节点发布图像话题Topic 扫码节点订阅并解析 发布识别到的字符串话题wechat_qrcode的主要功能实现依赖于detect.prototxtdetect.caffemodelsr.prototxtsr.caffemodel这样的四个模型文件。这四个文件可以在https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode下载同时opencv官网也提供该函数的使用说明。整个文件夹架构ros2_ws/├─ src/│ └─ qrcode_detector/│ ├─ package.xml│ ├─ setup.py│ ├─ setup.cfg│ ├─ resource/│ │ └─ qrcode_detector│ ├─ qrcode_detector/│ │ ├─ __init__.py│ │ └─ qrcode_node.py│ ├─ launch/│ │ └─ qrcode_detector.launch.py│ └─ models/│ ├─ detect.prototxt│ ├─ detect.caffemodel│ ├─ sr.prototxt│ └─ sr.caffemodel将下载好的四个模型文件复制进models文件夹后然后在代码里用 ROS2 的 package share 路径读取关键是models/需要被安装到 ROS2 的share目录。你的setup.py里要加上from glob import glob import os setup( nameqrcode_detector, # ... data_files[ (share/ament_index/resource_index/packages, [resource/qrcode_detector]), (share/qrcode_detector, [package.xml]), (os.path.join(share, qrcode_detector, models), glob(models/*)), (os.path.join(share, qrcode_detector, launch), glob(launch/*.py)), ], )然后在节点文件里面拿到路径import os import cv2 as cv from ament_index_python.packages import get_package_share_directory pkg_share get_package_share_directory(qrcode_detector) model_dir os.path.join(pkg_share, models) detector cv.wechat_qrcode.WeChatQRCode( os.path.join(model_dir, detect.prototxt), os.path.join(model_dir, detect.caffemodel), os.path.join(model_dir, sr.prototxt), os.path.join(model_dir, sr.caffemodel), )最后再使用解码模块进行解码得到信息import os import cv2 as cv from ament_index_python.packages import get_package_share_directory import rclpy from rclpy.node import Node from sensor_msgs.msg import Image from cv_bridge import CvBridge pkg_share get_package_share_directory(line_follower_pkg) model_dir os.path.join(pkg_share, models) detector cv.wechat_qrcode.WeChatQRCode( os.path.join(model_dir, detect.prototxt), os.path.join(model_dir, detect.caffemodel), os.path.join(model_dir, sr.prototxt), os.path.join(model_dir, sr.caffemodel), ) class WeChatQR(Node): def __init__(self): super().__init__(wechat_qr) self.bridge CvBridge() self.subscription self.create_subscription( Image, your topic, self.image_callback, 10 ) self.subscription # prevent unused variable warning def image_callback(self, msg): cv_image self.bridge.imgmsg_to_cv2(msg, desired_encodingbgr8) decoded_info, points detector.detectAndDecode(cv_image) if decoded_info: for info in decoded_info: self.get_logger().info(fDecoded QR Code: {info}) def destroy_node(self): self.cap.release() super().destroy_node() def main(argsNone): rclpy.init(argsargs) node WeChatQR() try: rclpy.spin(node) except KeyboardInterrupt: pass finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()

相关新闻

OpenClaw调度框架深度解析

OpenClaw调度框架深度解析

如果你在用AI Agent做复杂任务,你一定遇到过这些问题:对话稍微长一点,AI就开始“犯糊涂”,回答越来越离谱明明用的是顶级模型,Token账单却比工资涨得还快某个模型突然限流或宕机,整个任务就卡住了不知道什么…

2026/6/26 2:17:31阅读更多 →
如何用BatteryML开源工具精准预测电池寿命:新手完整指南

如何用BatteryML开源工具精准预测电池寿命:新手完整指南

如何用BatteryML开源工具精准预测电池寿命:新手完整指南 【免费下载链接】BatteryML 项目地址: https://gitcode.com/gh_mirrors/ba/BatteryML BatteryML是微软开源的电池寿命预测机器学习框架,专门用于解决电池性能衰减预测难题。无论你是数据科…

2026/6/26 2:17:31阅读更多 →
Pearcleaner:深度解析macOS应用清理的现代Swift架构实现

Pearcleaner:深度解析macOS应用清理的现代Swift架构实现

Pearcleaner:深度解析macOS应用清理的现代Swift架构实现 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾好奇macOS应用卸载后残留文件的…

2026/6/26 2:17:30阅读更多 →
为什么越来越多人选择大连长海县海参?

为什么越来越多人选择大连长海县海参?

这两年有个明显的趋势:身边越来越多朋友买海参的时候,点名要大连长海县的。哪怕价格比普通海参贵不少,也愿意为它买单。这让我挺好奇的,到底是什么原因让长海县海参这么受欢迎?今天就好好聊聊这个话题。好产地是基础长…

2026/6/26 3:27:36阅读更多 →
37.零 BUG 通用模板!PLC 电机正反转切换延时、软硬件双重互锁代码

37.零 BUG 通用模板!PLC 电机正反转切换延时、软硬件双重互锁代码

摘要 本文面向具备基本电工知识但缺乏PLC编程经验的工程师,系统梳理PLC的底层工作原理、I/O扫描机制、梯形图与结构化文本的转换逻辑。通过一个完整的电机正反转控制案例,从硬件接线到软件编程全流程展开,涵盖状态机设计、互锁保护、故障诊断等工业现场核心要点。文章提供可…

2026/6/26 3:27:36阅读更多 →
3分钟搞定B站缓存视频转换:m4s转MP4无损转换全攻略

3分钟搞定B站缓存视频转换:m4s转MP4无损转换全攻略

3分钟搞定B站缓存视频转换:m4s转MP4无损转换全攻略 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 还在为B站缓存视频只能在官方客户…

2026/6/26 3:27:36阅读更多 →
关于跳表与平衡树的结构差异与查询复杂度比较的技术8

关于跳表与平衡树的结构差异与查询复杂度比较的技术8

引言简要介绍跳表(Skip List)和平衡树(如AVL树、红黑树)的基本概念说明比较两者的意义(如应用场景、实现复杂度等)结构差异分析跳表的结构特点多层链表结构,通过概率实现层级分布节点包含多个指…

2026/6/26 3:27:36阅读更多 →
awesome-flutter-cn:Flutter 中文资源合集,3800 多 Star 不是白来的

awesome-flutter-cn:Flutter 中文资源合集,3800 多 Star 不是白来的

文章目录awesome-flutter-cn:Flutter 中文资源合集,3800 多 Star 不是白来的里面都有什么为什么值得收藏一点不足awesome-flutter-cn:Flutter 中文资源合集,3800 多 Star 不是白来的 做 Flutter 开发的人都知道,找资料…

2026/6/26 3:27:36阅读更多 →
Aeroblade空气动力学设计:从原理到工程实践

Aeroblade空气动力学设计:从原理到工程实践

1. 项目概述:从“空气之刃”到高效能空气动力学组件最近在折腾一个挺有意思的玩意儿,圈内朋友称之为“aeroblade”,直译过来就是“空气之刃”。乍一听这名字,是不是有点科幻片里未来武器的感觉?其实它跟武器没半毛钱关…

2026/6/26 3:22:35阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/25 9:39:54阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/25 2:52:24阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/25 9:01:34阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →