当前位置:   article > 正文

使用树莓派opencv-python实现色块追踪_python色块定位

python色块定位

代码如下,该代码利用hsv空间进行颜色识别,要提前给出阈值范围才可以匹配到

识别到对应色块能以色块为中心画圈,返回值为色块的中心坐标,配合舵机云台可以实现追踪

  1. #!usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. import numpy as np
  4. import cv2
  5. import serial
  6. import time
  7. #cap = cv2.VideoCapture('D:/Open CV/py/ziliao/zhuizong/VID_20220724_202819.mp4')
  8. cap = cv2.VideoCapture(0)
  9. ser = serial.Serial('/dev/ttyAMA0', 9600)
  10. def fenge(x):
  11. #分割得到的数据,将坐标除以4,得到小于255的数,便于发送,将小数和整数分割
  12. x_yuchu=x/4
  13. x_intpart=x//4
  14. x_fracpart=(x_yuchu-x_intpart)*100
  15. return (x_intpart,x_fracpart)#返回(整数,小数)
  16. while (cap.isOpened()):
  17. start_time = time.time()
  18. ret, frame1 = cap.read()
  19. if ser.isOpen == False:
  20. ser.open() # 打开串口
  21. if ret == True:
  22. #frame=cv2.resize(frame1,None,fx=0.5,fy=0.5)
  23. # 转换BGR2HSV
  24. hsv = cv2.cvtColor(frame1, cv2.COLOR_BGR2HSV)
  25. # 设定物体HSV阈值
  26. upper = np.array([156, 230, 255])
  27. lower = np.array([[0,116, 237]])
  28. mask = cv2.inRange(hsv, lower, upper)
  29. mask = cv2.erode(mask, None, iterations=2)
  30. mask = cv2.dilate(mask, None, iterations=2)
  31. # 找最大轮廓,提取质心
  32. cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
  33. center = None
  34. if len(cnts) > 0:
  35. c = max(cnts, key=cv2.contourArea)
  36. M = cv2.moments(c)
  37. center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
  38. print("cent_x=",center[0])
  39. print("cent_y=",640-center[1])
  40. ''' 这里是查看中心图标
  41. size = mask.shape
  42. y = size[0]//2
  43. x = size[1] // 2
  44. print("img_x=", x)
  45. print("img_y=",y)
  46. '''
  47. size = ser.inWaiting()
  48. if size != 0:
  49. res = ser.read(size)
  50. zuobiao_x=fenge(center[0])
  51. zuobiao_y=fenge(center[1])
  52. #发送坐标 0x5b 0xb3 x坐标/4整数 x坐标/4小数 y坐标/4整数 y坐标/4小数
  53. writebuf = bytearray([0x5b, 0xb3,zuobiao_x[0],zuobiao_x[1],zuobiao_y[0],zuobiao_y[1], 0x5b])
  54. ser.write(writebuf)# 读取内容并显示
  55. print(res) #调试用,查看收到的数据
  56. ser.flushInput() # 情况接收缓存区
  57. time.sleep(0.5) # 软件延时
  58. cv2.circle(mask, center, 7, 128, -1)#画点
  59. cv2.circle(mask,center,30,(0,255,255))#画圆
  60. # 可以根据质心坐标判断小车左右方向
  61. # cv2.imshow('frame',frame)
  62. cv2.imshow('mask', mask)
  63. cv2.imshow('image', frame1)
  64. # cv2.imshow('res',res)
  65. k = cv2.waitKey(5) & 0xFF
  66. if k == 27: # esc退出
  67. break
  68. #print("FPS:", 1.0 / (time.time() - start_time)) # 计算一下处理的帧速
  69. cap.release()
  70. cv2.destroyAllWindows()
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/566878
推荐阅读
相关标签
  

闽ICP备14008679号