当前位置:   article > 正文

Robocom比赛中使用opencv-python进行轨道线识别(附带python源码+讲解)

轨道线识别

1.前言:

此代码是本人参加Robocom比赛中完成其中一个要求模块使用的代码。主要功能是根据给定的图片,识别出黑色轨道线的线条在图片中的大致位置。如下图所示:

比赛要求:编写代码,从200张图片中随机选出20张图像,标出图像中 黑色线条的位置,并在终端中以文字形式输出机器人下一步应该如何调 整姿态(直行,向右前方调整方向,向左前方调整方向)。

2.源码

  1. import cv2
  2. import numpy as np
  3. import random
  4. import os, random, shutil
  5. file_Dir = 'mydata/平安城市测试集/轨道线识别/' #源图片文件夹路径
  6. tar_Dir = 'mydata/test3/' #移动到新的文件夹路径
  7. def moveFile(file_Dir):
  8. pathDir = os.listdir(file_Dir) #取图片的原始路径
  9. filenumber=len(pathDir)
  10. rate=0.1 #自定义抽取图片的比例,比方说100张抽10张,那就是0.1
  11. picknumber=int(filenumber*rate) #按照rate比例从文件夹中取一定数量图片
  12. sample = random.sample(pathDir, picknumber) #随机选取picknumber数量的样本图片
  13. print (sample)
  14. for name in sample:
  15. shutil.copy(file_Dir+name, tar_Dir+name)
  16. return
  17. if __name__ == '__main__':
  18. moveFile(file_Dir) #移动选取的文件
  19. for filename in os.listdir('mydata/test3'): #遍历路径下所有图片
  20. print(filename)
  21. image= cv2.imread('mydata/test3'+'/'+filename)
  22. image = cv2.resize(image,(600,600))
  23. gs_frame = cv2.GaussianBlur(image, (11, 11), 0) # 高斯滤波获取轮廓
  24. gray = cv2.cvtColor(gs_frame,cv2.COLOR_BGR2GRAY) # 原彩色图片转换成灰度图
  25. ret, binary = cv2.threshold(gray,145,255,cv2.THRESH_BINARY_INV) # 二值化
  26. kernel = np.ones((40, 40), dtype=np.uint8) # 膨胀图像
  27. dilate = cv2.dilate(binary, kernel, 1) # 1:迭代次数,也就是执行几次膨胀操作
  28. # 进行腐蚀
  29. kernel = np.ones((20, 20), dtype=np.uint8)
  30. erosion = cv2.erode(dilate, kernel, iterations=1)
  31. contours, hierarchy = cv2.findContours(erosion,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#轮廓检测,寻找边框
  32. area = []
  33. area_num = []
  34. for i in range(len(contours)):
  35. a = cv2.contourArea(contours[i], True)
  36. area.append(abs(a))
  37. if len(area) > 1:
  38. for i in range(len(area)):
  39. area_num.append(i)
  40. area_num.remove(area.index(max(area)))
  41. for i in range(len(area_num)):
  42. erosion = cv2.drawContours(erosion, contours, area_num[i], 0, cv2.FILLED)
  43. # 查询角点
  44. points_hang = []
  45. points_lie = []
  46. for i in range(600):
  47. for j in range(600):
  48. if erosion[i, j] != 0:
  49. points_hang.append(i)
  50. points_lie.append(j)
  51. c1 = min(points_hang)
  52. c2 = max(points_hang)
  53. c3 = min(points_lie)
  54. c4 = max(points_lie)
  55. if erosion[c1,c3] == 255 and erosion[c2,c3] == 0:
  56. print('left')
  57. if erosion[c1,c4] == 255 and erosion[c2,c4] == 0:
  58. print('right')
  59. if erosion[c1,c3] == 0 and erosion[c1,c4] == 0:
  60. print('Go straight')
  61. # 绘制图框
  62. cv2.rectangle(image, (c3,c1), (c4,c2), (0,255,0), 2)
  63. cv2.imshow("result", image)
  64. cv2.waitKey(0)

3.总结

以上就是我的代码,希望能够帮助大家。有什么问题大家也可以在评论区进行讨论交流。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/639037
推荐阅读
相关标签
  

闽ICP备14008679号