ROS + Opencv识别二维码并停车定位

您所在的位置:网站首页 扫码识别车型 ROS + Opencv识别二维码并停车定位

ROS + Opencv识别二维码并停车定位

#ROS + Opencv识别二维码并停车定位| 来源: 网络整理| 查看: 265

文章目录 前言一、二维码获取1.获取摄像头图片2.识别二维码3.完整代码 二、二维码处理1、获取偏差2.获取距离3.初步整合4.进阶判断 三、控制移动1、数据处理2、计算速度值3、整体逻辑 四、可以改进处

前言

最近,博主在比赛中有部分内容用到视觉识别二维码并进行跟随的内容。此部分主要由组内负责视觉的同学完成,此处备份留作后用。

整体逻辑主要采用PID中的P算法,根据小车摄像头实时获取到目标二维码在图像中的位置,计算其距离小车的长度以及偏离中小线的误差分别给予小车x和y方向上的线速度,从而达到,使得小车跟随二维码并当达到死区时停止的效果。

全部代码采用Python编写,主要采用了Opencv库和ROS框架实现。

一、二维码获取

首先需要完成第一步,即打开摄像头获取到图像数据并监测是否读取到二维码数据。

1.获取摄像头图片

此处为基本操作,不予分析。

import cv2 from cv2 import aruco # 获取摄像头图片 cap = cv2.VideoCapture(0) ret, frame = cap.read() while ret: # 获取下一帧图片 ret, frame = cap.read() # 读取摄像头画面 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 2.识别二维码

识别二维码主要采用了开源的aruco库进行识别,此处需要注意选择的二维码字典需要依据自己的情况进行更换。

aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50)

此处导入的二维码字典为包含50个标记的4X4大小的二维码。每个词典中所有的Aruco标记均包含相同数量的块或位(例如4×4、5×5、6×6或7×7),且每个词典中Aruco标记的数量固定(例如50、100、250或1000)。

aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50) parameters = aruco.DetectorParameters_create() corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict,parameters=parameters) aruco.drawDetectedMarkers(frame, corners,ids)

通过上述代码即可获取到二维码在字典中的ID。可通过如下代码进行监测是否查询到目标二维码。

# 当读取到二维码ID: if not (ids is None): # 打印ID值 print(ids[0][0]) 3.完整代码

全部逻辑如下所示:

import time import cv2 from cv2 import aruco # 获取摄像头图片 cap = cv2.VideoCapture(0) ret, frame = cap.read() while ret: # 获取下一帧图片 ret, frame = cap.read() # 读取摄像头画面 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 加载二维码字典 aruco_dict = aruco.Dictionary_get(aruco.DICT_4X4_50) parameters = aruco.DetectorParameters_create() corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters) aruco.drawDetectedMarkers(frame, corners,ids) # 当读取到二维码ID时触发: if not (ids is None): # 打印二维码的ID值 print(ids[0][0]) 二、二维码处理

获取到二维码ID后,为了实现整体逻辑需要进一步对二维码图像进行处理,从而获取到二维码的偏差值error和距离值length。

1、获取偏差

由于博主使用的摄像头宽度为680,所以在计算error时中线处即表示为340。通过获取二维码两侧像素所在行计算二维码中心线并减去图像中心,从而可以获取到二维码偏差值。

error = (corners[num][0][0][0] + corners[num][0][1][0]) / 2 - 340 2.获取距离

在计算取距离时,此处博主经过实验发现在我的摄像头中,当二维码的宽度达到190px时停止可以达到较好效果,故而用190减去二维码的宽度,从而计算取距离值。

length = 190 - (corners[num][0][1][0] - corners[num][0][0][0]) 3.初步整合

通过整合上述两部,可以获取到目标二维码的偏差和距离值。

error_pub = rospy.Publisher('/cv/error', Int16, queue_size=5) length_pub = rospy.Publisher('/cv/length', Int16, queue_size=5) final_pub = rospy.Publisher('/cv/final', Int16, queue_size=5) num = 0 for ider in ids[0]: if (ider == 0 or ider == 1 or ider == 2): if ider == final_ID: # 目标二维码ID error = (corners[num][0][0][0] + corners[num][0][1][0]) / 2 - 340 length = 190 - (corners[num][0][1][0] - corners[num][0][0][0]) msg.data = int(error) error_pub.publish(msg) msg.data = int(length) length_pub.publish(msg) if abs(error)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3