如何利用Python语言进行——航偏校正

           限量版之前参加研电赛,做的无人机与Nao机器人的协同系统,成功获得赛区一等奖加特奖晋级全国总决赛。我是一个很懒的的人,比赛完了做一下总结,把自己利用的技术,写出来,和大家一起分享~喜欢的话请关注我的博客,后续会继续更新,分享收藏都可以哈~

        好了言归正传,开始正题~

首先谈谈,为什么要进行航偏校正,地面Nao机器人在迷宫里行走时由于电机自身误差、发热等因素造成的行走偏差,提出了航向修正、机体侧移相结合的校正方法。首先运用颜色分割的方法提取出黑色导航线,然后根据推导出的公式对图像进行校正,接着根据校正后的图像计算出偏转角,从而进行航向修正,最后根据校正后的图像计算出需要侧移的数值,进行侧偏修正,从而完成全部的航偏校正。通过实验进一步证明了本方法的可行性与准确性,在机器人出现跑偏的情况时,能够及时有效的完成航偏校正,保证机器人在迷宫里行走时,能够处于道路正中央,避免与墙壁碰撞等情况的出现。

 

    霍夫变换能够检测图像中具有相同特征的几何形状(如,直线,圆等)。霍夫变换相对于其它方法可以更好的减少噪声干扰,霍夫变换算法的直线检测算法思想是一条直线在图像中是一系列离散点的集合,通过一个直线的离散极坐标公式,可以表达出直线的离散点几何等式如下:

                                               X *cos(theta) + y * sin(theta)  = r 

其中角度theta指r与X轴之间的夹角,r为到直线几何垂直距离。任何在直线上点,x, y都可以表达,其中 r,theta是常量。该公式图形表示如下:

如何利用Python语言进行——航偏校正_第1张图片

 

  霍夫变换公式图形

 

     然而在实现的图像处理领域,图像的像素坐标P(x, y)是已知的,而r, theta则是我们要寻找的变量。如果我们能绘制每个(r, theta)值根据像素点坐标P(x, y)值的话,那么就从图像笛卡尔坐标系统转换到极坐标霍夫空间系统,这种从点到曲线的变换称为直线的霍夫变换。变换通过量化霍夫参数空间为有限个值间隔等分或者累加格子。当霍夫变换算法开始,每个像素坐标点P(x, y)被转换到(r, theta)的曲线点上面,累加到对应的格子数据点,当一个波峰出现时候,说明有直线存在。编程思路为首先读取一幅带处理二值图像,最好背景为黑色,然后取得源像素数据,再根据直线的霍夫变换公式完成霍夫变换,预览霍夫空间结果,最后寻找最大霍夫值,设置阈值,反变换到图像RGB值空间。地面Nao机器人走偏时拍照照片如图2所示,根据霍夫算法检测到直线并进行角度矫正及偏移矫正后拍摄的照片如图3所示

如何利用Python语言进行——航偏校正_第2张图片

    图2-机器人走偏时拍照照片

 

如何利用Python语言进行——航偏校正_第3张图片

 

图3-进行角度矫正及偏移矫正后拍摄的照片

 

 

具体实现代码如下:

编程环境:Linux

程序语言:Python

##来自于HL限量版##

import cv2

import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('third.jpg') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度图像 
#open to see how to use: cv2.Canny

edges = cv2.Canny(gray,50,200)
plt.subplot(121),plt.imshow(edges,'gray')
plt.xticks([]),plt.yticks([])
#hough transform
lines = cv2.HoughLinesP(edges,1,np.pi/180,30,minLineLength=60,maxLineGap=10)
lines1 = lines[:,0,:]#提取为二维
for x1,y1,x2,y2 in lines1[:]: 
    cv2.line(img,(x1,y1),(x2,y2),(255,0,0),1)

plt.subplot(122),plt.imshow(img,)

plt.xticks([]),plt.yticks([])

喜欢的话,或者有不理解的地方请关注我的博客,后续会继续更新,分享收藏都可以哈~

你可能感兴趣的:(技术,机器学习)