利用Robocon2018 比赛地图 + OpenCv + matplotlib拟合贝塞尔曲线,并且生成路径坐标点

简介: 原文链接本文内容:贝塞尔曲线简介代码算法讲解总结贝塞尔曲线简介:原理:Github上一位大佬已经总结得很详细了, 还有动态图的哦,,我这里就直接引用啦Github计算公式:此处引用简书一位大佬的总结:@L_Xian;该大佬不仅解释了贝塞尔曲线的原理,还详细的推导了贝塞尔曲线各阶公式之间的联系。

本文内容:

  • 贝塞尔曲线简介
  • 代码算法讲解
  • 总结

贝塞尔曲线简介:

原理:

Github上一位大佬已经总结得很详细了, 还有动态图的哦,,我这里就直接引用啦Github

计算公式:

此处引用简书一位大佬的总结:@L_Xian;
该大佬不仅解释了贝塞尔曲线的原理,还详细的推导了贝塞尔曲线各阶公式之间的联系。

意义:

此处只说一下对于全向机器人运动的意义:
由于贝塞尔曲线是一条光滑的曲线,即高阶可导。若机器人的运动轨迹可以拟合在这条曲线上,运动转弯将更加顺滑,这就催生了我写这个小程序的想法。利用 Python强大的科学计算,图像处理,绘图能力。将一个标准的场地地图导入,二值化之后,使用在地图上点击的起点与终点已经2个控制点,绘制出3阶贝塞尔曲线,再经过坐标转换,生成适合场地的机器人运动轨迹坐标。

代码算法讲解:

获取鼠标点击的点:

class Get_Point_:
    # 使用OpenCv对图像进行初步的处理

    # 使用 plt获取鼠标点击的坐标
    def Get_Pos(src_img):
        plt.imshow(src_img, cmap=plt.get_cmap("gray"))
        pos = plt.ginput(4)
        return pos

    def Get_Point():
        return Points_List_

    def Get_Image():
        src_img = cv.imread('./img/changdi2.png')
        src_Gray_Image = cv.cvtColor(src_img, cv.COLOR_BGR2GRAY)
        ret, dst_Image = cv.threshold(src_Gray_Image, 98, 255, cv.THRESH_BINARY)
        return dst_Image
  • Get_Pos(src_img):

使用plt显示图像,并且利用.ginput(n)获取n个鼠标点击的点的坐标,这样子的好处是,matplotlib可以很容易的放大缩小图像,且坐标轴方向相对使用OpenCv与实际更为接近。

  • Get_Image():

使用OpenCV将图像灰度化然后二值化,便于观察绘制的曲线。

坐标点的解算:

这里直接使用的3阶贝塞尔曲线的方程,解算出各个坐标点

    # 解算Bezier方程的系数
    def Build_Bezier(Point_0, Point_1, Point_2, Point_3, t):
        A_0 = (1 - t) ** 3
        A_1 = ((1 - t) ** 2) * 3 * t
        A_2 = (t ** 2) * (1 - t) * 3
        A_3 = t ** 3

        x = Point_0[0] * A_0 + Point_1[0] * A_1 + Point_2[0] * A_2 + Point_3[0] * A_3
        y = Point_0[1] * A_0 + Point_1[1] * A_1 + Point_2[1] * A_2 + Point_3[1] * A_3
        return [int(x), int(y)]  # 坐标转换

return [int(x), int(y)]可以根据自己的需要对x, y进行转换之后再返回。

绘制图像

此处我绘制了未拟合的坐标点(红色),已经我们拟合出的路径(绿色)。
可见上面的演示

增加的功能:

既然已经生成了理想的运动轨迹,大可再绘制实际的运动轨迹,只需要利用无线串口之类的模块将机器人的运动轨迹实时传回电脑,然后在场地上绘制出轨迹。如演示图中左上角的绿色的,不太和谐的绿色曲线,,emm,,那个只是我作的一个小实验,,随便弄的几个点,然后画在同一张图中这样子。。

总结:

其实吧,,这个程序挺简单的,但是这个至少可以说明,自己完全可以利用程序实现自己的想法了。

GitHub

目录
相关文章
|
2月前
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
167 0
|
2月前
|
计算机视觉 Python
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
OpenCV轮廓拟合与凸包的讲解与实战应用(附Python源码)
92 0
|
2月前
|
API C++ 计算机视觉
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
|
2月前
|
计算机视觉
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
OpenCV(三十四):轮廓外接最大、最小矩形和多边形拟合
276 0
|
存储 API 图形学
OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
轮廓检测指检测图像中的对象边界,更偏向于关注上层语义对象。如OpenCV中的findContours()函数, 它会得到每一个轮廓并以点向量方式存储,除此也得到一个图像的拓扑信息,即一个轮廓的后一个轮廓、前一个轮廓等的索引编号。
1347 0
|
API C++ 计算机视觉
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
【opencv3】鼠标框选矩形并显示当前像素点坐标和矩形中心点坐标C++
|
算法 API 图形学
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
1802 0
我的Qt作品(7)使用Qt+OpenCV实现图像轮廓提取,再用三阶贝塞尔曲线拟合成光滑线条/多边形拟合
|
Python
Matplotlib 中文用户指南 3.8 路径教程
路径教程 原文:Path Tutorial 译者:飞龙 协议:CC BY-NC-SA 4.0 位于所有matplotlib.patch对象底层的对象是Path,它支持moveto,lineto,curveto命令的标准几个,来绘制由线段和样条组成的简单和复合轮廓。
939 0
|
Python
Matplotlib 中文用户指南 3.9 路径效果指南
路径效果指南 原文:Path effects guide 译者:飞龙 协议:CC BY-NC-SA 4.0 Matplotlib 的patheffects模块提供了一些功能,用于将多个绘制层次应用到任何艺术家,并可以通过路径呈现。
838 0
|
计算机视觉
OpenCV计算物体的重心坐标(2值图像)
效果图: 代码: // FindGravity.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include "cv.
2507 0