ROS + Opencv识别二维码并停车定位 |
您所在的位置:网站首页 › 基于ros的目标跟随 › ROS + Opencv识别二维码并停车定位 |
文章目录
前言一、二维码获取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 |