使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现

本次的程序功能实现是在师兄原有程序的基础上,经我继续开发的。主要完成的功能是使用QR码定位,将位姿信息通过ROS中的tf变换发布出去,采用的是OpenCV和Zbar库相结合的解码方式,硬件上使用的是大恒水星工业相机,可以调节曝光时间,普通的网络摄像头相应的程序也有开发,在这里不再叙述。

实现的过程将分为三个部分来描述。1、硬件安装;2、软件安装;3、定位过程。之所以提到硬件,是因为硬件问题也很重要,只有正确的安装硬件,才能获得图像信息,进行图像处理,为下一步定位做准备。软件上使用的是OpenCV和Zbar,因为是免费的开放软件和解码包,为后续工作的开发提供便利,且使用Zbar进行解码比较容易(相比于dmtx库)。定位方法因人而异,不过别人的一些方法可以借鉴。

1、硬件安装

使用的是大恒水星相机MER-030-120UM/UC,镜头焦距是16mm。性能参数如下:

 

下载大恒相机的驱动程序daheng_x64_1.3.1502.1506,在Ubuntu系统中,使用的是generic.39 的内核,目前大恒相机只开发到此版本相应的内核,需要在此内核下才能安装大恒相机的驱动程序。每次使用的时候,都要安装驱动程序,命令$sudo ./INSTALL.sh,会提示安装成功,此时相机就可以用了。目前还没有很好的办法去解决这个兼容问题,我曾试过在其他版本的内核下运行同样的程序,但提示找不到相机的接口,因此无法使用,所以要使用此款工业相机,需要按照这种方式去做。连接上数据线。

例子:

zcn@zcn:~/Downloads/daheng_x64-1.3.1502.1506$ sudo ./INSTALL.sh

[sudo] password for zcn:

***********************************************************************************************

SelfInstaller

SDK install successs!

ERROR: Module videodev is in use by uvcvideo

Driver install success!

Please restart current terminal...

***********************************************************************************************

此时,相机可以正常使用。

2、软件安装

下载OpenCV包,官网上都有的,可自行下载,照装入软件的步骤一步步装入,这是准备工作,同样Zbar的解码包也是。可用命令$sudo apt-get install ros-hydro-zbar*来装解码包,dmtx解码包也可用同样的命令安装。目前电脑上安装的是Ubuntu12.04,OpenCV版本是2.4.9。

$sudo apt-getinstall ros-hydro-zbar*

提示:

3、定位过程。

着重讲的是这部分的内容。首先是图像采集,采集之后的图像交给OpenCV来处理,利用Zbar库解出二维码的内容。在图像平面中对二维码的角度进行求解,利用二维码四个顶点的像素信息和图像平面的中心之间的关系,求出图像中心相对于二维码坐标系所在的象限,根据坐标分解求出图像中心在世界坐标系中的实际坐标信息,车体的角度可通过求二维码的偏转角度而得到。

效果如下图:

(1)拆解QR解码内容

通过symbol->get_data()可以直接解出QR码中融入的内容,将该字符串转换为char类型,可以用srotok函数进行字符串分割。此过程需要注意字符串类型的转换,思路是:在不同的类型之间搭一座桥,两者可以进行处理了。将分割后的字符作为下面计算坐标的依据。

(2)输出QR码四个顶点

在图像平面坐标系中,每个顶点的像素坐标是已知的,可以直接通过symbol->get_localization()来获得。由于使用Zbar进行解码,旋转矩形的四个顶点可以直接求出。比用dmtx库进行图像处理方便很多。在使用dmtx库时,是用canndy算子进行边缘检测,二值化,矩形大小匹配等处理,比较复杂。

坐标系的建立及QR顶点:

使用line(imgout,Point(),Point(),Scalar())来画出四个顶点连成的矩形。

由于opencv中没有直接画箭头的函数,因此可以调用drawArrow函数来画箭头。具体实现在网上都有例子。

(3)计算边的像素长度和夹角。

点的像素坐标是已知的,因此三边的长度可以计算得到,可通过余弦定理来求两边的夹角。

(4)AB边与像平面坐标轴的夹角。

这里利用了r.angle,这个是QR码矩形的倾斜角度,可以用来获取AB与X轴、Y轴的夹角。此处注意判断条件的完备性。

(5)O点在QR码规定的坐标系中所处的象限

这里主要是通过AO与BA方向的夹角来进行判断O点所在的象限的。AO与BA方向的夹角可以通过AO与X轴正方向夹角、BA与X轴正方向夹角来获得,共同选取X轴正方向为角度判断依据。

此处的问题:由于角度信息求取不准确,因此后面判断象限时有错误,说明方法有误,需要考虑完备的方案。解决思路:选取共同的一条边为依据,计算角度,两个相对角度的差即为角度差的绝对值,然后通过角度的绝对值来判断O点所在象限。此方法是师兄提供的。

注:这个象限角度的确定问题,下面讲述下我是如何解决的。先确定A点在四个象限中的位置,然后确定AO向量与X 轴正方向的夹角。使用了fastAtan()函数,需要明白它的角度范围,根据向量AO在第几象限从而确定夹角angle_AO,此处我是采用绝对值的方式加减一个角度值来实现的。调试的过程中可以调节增量,保证数值是连续的,而且要考虑边界时的情况,保证判断条件的完备性。

(6)象限判断后可以求出O点在世界坐标系中的坐标

规定BA方向为QR码的X轴正方向,AD方向为QR码的Y轴正方向。根据O点,分为不同的象限,将AO的像素长度分解到BA和AD方向上,每个像素在实际坐标系中所代表的距离可以通过相机的标定来获得,因此可以求出车体的x,y坐标。

(7)发布并tf变换

将得到的x,y,theta信息通过tf变换广播并发布出去,遵循ROS节点的机制,其他的节点可以订阅此信息,于是定位功能到此完成。

(8)为何选取图像平面的中心O点?

这个问题是反复测试之后才确定的。曾选用图像的坐标原点为计算依据,利用图像坐标原点和图像中心点的关系来计算,这样会省去中间过程中象限确定及角度确定的繁琐。然而最终坐标在图像坐标原点和图像中心点转换时,还是需要考虑到车体的偏转角度也即是AB与X轴或Y轴正方向的夹角的,所以这种方式不可行。

总结:

1.角度的转换问题是一个难点,若夹角不准确,则后面的判断结果必然错误,关于象限求角度,其实是可以有不同求法的。

2.提取分割的数据时,注意字符串的数据类型,需要经过一步转换满足条件后才可以进行分割提取。

第一次写,难免有不足之处。这只是一个实现过程,欢迎多多交流。

使用大恒水星相机利用OpenCV+ Zbar 解QR码在ROS下定位的实现相关推荐

  1. 大恒水星相机开发记录

    大恒水星相机开发记录 前面的话: 最近搞了一个大恒的相机MER-500-14GC,本着这可是行业龙头的工业相机嘛,终归是在学校摸到了真正的工业级产品了.(٩(๑>◡<๑)۶) 想着用ope ...

  2. 大恒水星相机+opencv4.0.1保存视频

    最近项目上需要做一个保存相机视频的功能,手头上刚好有一个大恒130W分辨率的黑白水星相机.因此,就用该摄像机结合opencv实现了该功能. 准备工作: 1.OpenCV:版本4.0.1 2.大恒水星相 ...

  3. 配置网口相机(大恒水星相机)

    配置网口相机(大恒水星相机) 相机参数: 首先查看电脑是否为支持千兆网口. 从这里看的出来(GbE)是千兆的. 也可以用鲁大师,用鲁大师查看,确实是千兆网口. 命令行输入ipconfig/all,可以 ...

  4. Ubuntu16.04使用大恒工业相机

    Ubuntu16.04使用大恒工业相机 文章目录 Ubuntu16.04使用大恒工业相机 下载驱动 解压 安装 驱动安装完成 使用Python采集图片 下载驱动 驱动下载网址(需要注册登录):http ...

  5. OpenCV在相机或图像中检测QR码的实例(附完整代码)

    OpenCV在相机或图像中检测QR码的实例 OpenCV在相机或图像中检测QR码的实例 OpenCV在相机或图像中检测QR码的实例 #include "opencv2/objdetect.h ...

  6. linux 相机,linux下使用大恒相机实时运行ORB-SLAM

    平台:Ubuntu 16.04 相机: MER-301-125U3M (大恒其他型号的USB相机亦可) 本文是在原有ORB-SLAM源码基础上增加大恒相机的运行示例,用大恒相机实时运行ORB-SLAM ...

  7. QT 驱动大恒水星相机

    编程环境 vs2019+QT5.12.10 大恒官方相机驱动库 下载驱动->安装驱动 默认路径安装即可.参考编程mfc例子路径 搭建测试demo 首先相机初始化列表在构造过程中 在cam.cpp ...

  8. 绑定ZBar的OpenCV条形码和QR码扫描器

    pip 安装 opencv 教程 https://hotdog29.com/?p=550 今天的博客文章分为四个部分. 在第一部分中,我将向您展示如何安装ZBar库 (使用Python绑定). ZBa ...

  9. Opencv+Zbar二维码识别(标准条形码/二维码识别)

    使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不 ...

最新文章

  1. 多变量线性回归 原理
  2. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)
  3. python中matlab函数图像处理,MATLAB图像处理--同态滤波(代码及示例)
  4. java的向下转型_终于搞明白向下转型的作用了,还不懂的进来看下.
  5. 遇到IIS configuration error错误的可以看看,不一定是权限问题
  6. [tf] Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initial
  7. sed 插入多行_文本三剑客之sed
  8. 企业中MySQL高可用集群架构三部曲之MM+keepalived
  9. 关于博弈论的硬币问题
  10. 微信声音锁会上传到服务器吗,微信声音锁安全吗?微信声音锁可以换吗?
  11. wpa_cli工具的使用方法及分析
  12. 【网络运维与安全岗位】月薪2.5w,您还不知道的前景!
  13. mysql使用dual进行自定义数据查询
  14. 【本人秃顶程序员】高级 Java 必须突破的 10 个知识点!
  15. 小白兔写话_可爱的小白兔二年级写话
  16. eclipse的使用操作技巧
  17. 使用代理服务器爬取网站
  18. oc 基础教程 读书笔记
  19. 路由器CFE-固件-NVRAM
  20. Android获取重力加速度和磁场强度

热门文章

  1. JavaScript的发布订阅模式
  2. VUE中兼容低版本浏览器及安卓5.0以下的设备
  3. JedisPool 注入失败 ,自动注入JedisPool 空指针 问题
  4. win11系统新版edge不兼容网银如何解决【解决办法】
  5. html 瀑布流样式,纯css如何实现瀑布流?css实现瀑布流的两种方式
  6. c# 制作gif的四种方法
  7. 开发实战:如何利用实时语音转写技术搞定会议纪要
  8. Thingworx 8.*启动失败
  9. qdialog 返回值_PyQt5 中QDialog值传递
  10. 谷歌浏览github插件