[Opencv]圆盘目标跟踪系统——激光打靶

本文详细介绍了基于TI TM4C123GXL单片机和树莓派4B+摄像头的激光追踪系统。项目中,步进电机驱动圆盘旋转,通过Camshift算法进行颜色目标检测,实现激光点对磁贴的追踪。然而,由于环境因素和色相漂移,最终采用了开环控制,通过预先计算的线性关系控制舵机。尽管存在抗干扰能力不足和背景颜色敏感的问题,该系统仍展示了良好的追踪效果。
摘要由CSDN通过智能技术生成

        这个小项目是学校为电赛训练自拟的题目,概括来说要求如下:

        (1)圆盘正面用白色纸粘贴铺满,绘制两个同心圆,直径分别为250mm和150mm。圆盘与电机同轴连接,电机能够带动圆盘旋转。

        (2)圆盘正面吸附红、黄、蓝三种颜色的磁贴,追踪系统根据要求使激光点的射线落点位于对应磁贴上。

        最后实现的部分效果上传到了B站上,附上链接:        通院科协电子部【激光打靶】_哔哩哔哩_bilibili

        下面简略介绍单片机控制部分然后详细介绍图像处理实现部分。

  一.单片机控制部分

        本题规定使用的控制核心是TI系列的单片机,我们选择的是TM4C123GXL。下面分电机控制和舵机控制介绍

 1.电机控制

        电机控制比较简单。

        我们使用的是步进电机带动圆盘转动,因为题目要求的转速比较低,普通的直流减速电机达不到,故使用步进电机。

        交互方式使用了一个矩阵键盘,控制电机开始转动,转动方向。

2.舵机控制

        舵机控制是本题的难题。

        我们选用的数字舵机,对于诸如控制舵机旋转角度的方法我们也比较熟练,所以选择合适的控制算法尤其重要。

        一开始的思路是,首先图像处理模块采集到目标磁贴在图像中的中心点坐标激光点的中心点坐标,发送给单片机,单片机再通过控制算法由两者的坐标得到舵机旋转的角度,闭环控制,以达到追踪的效果。

        对于这种思路,控制算法我们尝试了增量式PID算法和模糊控制算法,结果都不理想。原因主要是图像方面,当磁贴与激光点重合时,两者的色相在图像中均会有极大的漂移,导致发送给单片机的坐标信息变化很大,最后控制效果不佳。

        最后我们采用的整体方案是:图像处理部分仍然采集目标磁贴在图像中的中心点坐标激光点的中心,但舵机采用开环控制。在系统启动时,先算出舵机角度与激光点坐标的线性关系,然后单片机只根据目标磁贴的坐标控制旋转角度。

        具体算法流程和代码由我队友周哥编写,不知道能否请他来讲一讲【滑稽】

        整个装置的机械结果是我余姐设计的,在此也感谢整个暑假三人的愉快合作。

3.图像处理

        图像处理模块采用的是树莓派4B+摄像头的方案。

        乍一看也许磁贴的识别也许就是普通的颜色识别,但如上部分所说,必须克服色相漂移带来的干扰。简单的颜色识别方法在我以前的博文里有,下面介绍的是Camshift算法

        Camshift算法是一种目标检测算法,由于它是以运动物体的颜色信息作为特征,所以非常适合用于本题。

        Camshift是一种连续的Meanshift算法,从名字上就可以看出两者的联系。基本思想是以视频图像中运动物体的颜色信息作为特征,对输入图像的每一帧分别作 Mean-Shift 运算,并将上一帧的目标中心和搜索窗口大小(核函数带宽)作为下一帧 Meanshift 算法的中心和搜索窗口大小的初始值,如此迭代下去,就可以实现对目标的跟踪。它是一种半自动的跟踪,需要事先标出目标物体。该算法能够自动调节搜索窗口大小来适应目标的大小,所以即便色相漂移导致二值化图像中的目标大小形状发生变化,目标的中心也不会有太大变化,鲁棒性良好。

        Opencv中有自带的函数实现Camshift算法,可以在source/sample/cpp中找到Camshift的示例程序学习,本项目中的相关代码也是由此修改得到的。

        实测得到的结果有明显改善,打印坐标数据的波形图也平滑了许多。

        下面介绍修改Camshift示例代码的思路。

       示例代码中的处理思路是:先用鼠标标定目标物体,然后通过计算目标HSV空间下的H分量直方图,通过直方图反向投影得到二值化图像,最后调用Camshift函数,自动跟踪并调整目标窗口的中心位置与大小。

        修改的话,我们需要去掉鼠标标定的过程,改为自动寻找指定颜色的目标。只需要在程序中存储红黄绿三色磁贴的H分量的值,以此来替代计算鼠标框中区域的直方图,然后做直方图反向投影和Camshift运算。

        代码在树莓派上,暂不附上。

4.总结

        目前该作品还存在着不足

        (1)开环的抗干扰能力太差,很多时候挪动装置都会导致效果有偏差,并且追踪不能达到完美的稳定。

        (2)Camshift对环境的抗干扰能力还是有所欠缺,由于是基于颜色特征的跟踪,故对背景有颜色敏感。

        希望努力能得到回报。

在相机标定中,OpenCV可以通过识别标靶来进行标定。标靶通常是一个具有特殊图案或特征点的棋盘格或者圆点阵列。为了进行准确的相机标定,需要多张包含标靶的图片。 首先,将相机固定在一个位置上,保持相机与标靶之间的距离和角度不变。然后,通过相机采集多幅包含标靶的图片。曝光和焦距要一致,并确保标靶在图片中占据合适的比例和居中。 接下来,使用OpenCV提供的函数读取图片,并利用图像处理算法识别出标靶。对于棋盘格标靶,可以使用findChessboardCorners函数找到内角点的像素坐标。对于圆点阵列标靶,可以使用findCirclesGrid函数找到圆心的像素坐标。 一旦找到了标靶的特征点,可以使用这些特征点进行相机标定。标定的目标是确定相机的内参矩阵(包括焦距和主点位置)以及外参矩阵(包括相机的旋转和平移向量)。通过在多幅图片中的不同位置和角度下采集的特征点,可以优化估计出相机的内外参。 最后,完成标定后,可以使用标定结果来进行相机校正和姿态估计等计算。校正后的图像可以更准确地进行测量和分析,提高相机的测量精度。 总结来说,OpenCV可以通过识别标靶上的特征点来进行相机标定,标定的结果可以用于相机校正和姿态估计等应用。相机标定是计算机视觉中的重要步骤,能够提高图像处理的精度和可靠性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值