基于jetson nano 与ubuntu18.04,B站:Mr张旭zx 解释: 4.1dispose()函数 参数:image_dispose(要处理的画面) 作用:翻转图片,二值化图片,对图片进行降噪,切割画面 过程:由于摆放摄像头的时候,摄像头是反过来摆放的,所以要用cv2.flip()函数对图片进行翻转;cv2.findContours()只能接受二值化的图片,所以结合了红色蓝色的阈值和cv2.inRange()函数对图片进行二值化;我们使用的是双目摄像头,读取到的画面是两个摄像头的,所以用分割二维numpy数组的方式对图片进行分割然后返回 返回值:处理过后的两张图片
4.2find_armor()函数 参数:thresh_img(二值化后的图片) 作用:找到二值化图片中的装甲板 过程:用cv2.findContours()函数找到图片中所有的轮廓,将轮廓赋值给contours列表,把层次复制给hierarchy列表,再遍历hierarchy列表。hierarchy列表中的每个子列表中每个元素的含义是:[后一个轮廓的下标, 上一个轮廓的下标, 父轮廓, 子轮廓](如果没有则值为-1)。根据这个原理,只要找到了一个最后一个元素不等于-1的子列表,就可以获得图片中一个内嵌轮廓的下标。程序找到所有的子轮廓并计算它们的面积,面积最大的子轮廓就是装甲板的轮廓,然后计算装甲板所在的坐标并返回 返回值:装甲板在图片中的坐标
4.3dep()函数 参数:x1,x2,y1(int)(在两个摄像头中找到的装甲板的坐标) 作用:计算要打到所识别的装甲板,要在俯仰轴、航向轴上各旋转多少度,同时计算从当前位置到所识别的装甲板的距离 过程: 返回值:俯仰轴、航向轴的旋转度数和距离目标装甲板的距离
4.4uart_send()函数 参数:shoot_yaw,shoot_pitch,shoot_dis(int)(俯仰轴、航向轴的旋转度数和距离目标装甲板的距离) 作用:向app端发送yaw,pitch,dis的数据 过程:先创建一个serial.Serial对象,向内置的ttyTHS1串口写入yaw,pitch,dis的数据,再将其发送到机器,当操作选手调用机器人上的双目自瞄程序的时候,双目自瞄程序就可以从串口接收数据,并控制机器人瞄准发射 返回值:None
4.5analyze_samples()函数 参数:six_samples(list)(获取到的六个装甲板的数据,结构[[x1,x2,y1,y2]…]) 作用:分析列表中的数据,并返回可用的数据 过程:由于在识别过程中可能会出现无用的数据(比如误识别或者没有识别到等),这个函数会比较six_samples的每个子列表中的x1和x2的值,如果x1>x2且|y1-y2|<=10,那么这就是一个有效的样本,然后再遍历选择出来的有效样本,计算每个样本中的x1-x2的值,去掉最大最小,然后返回处理完的样本列表 返回值:处理完的样本列表
4.6主程序 作用:综合各个函数的功能,实现自瞄 过程:循环读取摄像头中的画面,如果读取成功,用dispose()函数对图片进行翻转、二值化、切割,用left_frame和right_frame存放切割后的画面,然后将两张图片分别传入find_armor()函数,得到x1,y1,l_image(左侧摄像头读取的图片中装甲板的位置和描出装甲板轮廓后的图片)和x2,y2,r_image(右侧摄像头读取的图片中装甲板的位置和描出装甲板轮廓后的图片)。将[x1,y1,x2,y2]存入列表new中,存储了6个样本后,将new列表传入analyze_samples()函数中,将返回的列表放在变量final里,然后分别求出x1,y1,x2,y2的平均值,再通过dep()函数计算俯仰轴、航向轴的旋转度数和距离目标装甲板的距离,分别存放在yaw,pitch,dis变量中,然后通过uart_send()函数发送到机器人,通过机器人上的双目自瞄程序控制机器人云台旋转并发射