• 树莓派4B_OpenCv学习笔记19:OpenCV舵机云台物体追踪


    今日继续学习树莓派4B 4G:(Raspberry Pi,简称RPi或RasPi)

     本人所用树莓派4B 装载的系统与版本如下:

     版本可用命令 (lsb_release -a) 查询:

     Opencv 版本是4.5.1:

     Python 版本3.7.3:

    ​​

    今日学习:OpenCV舵机云台物体追踪  代码是 创乐博的,本文只作解释分析......

    前置学习条件如下:

    IIC驱动_PCA9685(16路舵机驱动模块)     文章网址 如下:

    树莓派学习笔记18:IIC驱动_PCA9685(16路舵机驱动模块)-CSDN博客

     Python多线程编程     文章网址 如下:

    树莓派4B学习笔记14:Python多线程编程_线程间的同步通信_(锁‘threading.Lock’)_树莓派多线程-CSDN博客

    文章提供测试代码讲解,整体代码贴出、测试效果图

    目录

    测试效果视频:

    代码贴出:

    例程测试步骤:

    例程测试步骤相关工程下载:

    网上查阅资料网址:


    测试效果视频:

    OpenCV舵机云台物体追踪

    代码贴出:

    1. # -*- coding: utf-8 -*-
    2. from __future__ import division
    3. import time
    4. import cv2
    5. import numpy as np
    6. import Adafruit_PCA9685
    7. import RPi.GPIO as GPIO
    8. import threading
    9. #初始化PCA9685和舵机
    10. servo_pwm = Adafruit_PCA9685.PCA9685() # 实例化舵机云台
    11. # 设置舵机初始值,可以根据自己的要求调试
    12. servo_pwm.set_pwm_freq(60) # 设置频率为60HZ
    13. servo_pwm.set_pwm(5,0,325) # 底座舵机
    14. servo_pwm.set_pwm(4,0,325) # 倾斜舵机
    15. time.sleep(1)
    16. #初始化摄像头并设置阙值
    17. usb_cap = cv2.VideoCapture(0)
    18. # 设置球体追踪的HSV值,上下限值
    19. ball_yellow_lower=np.array([171,161,186])
    20. ball_yellow_upper=np.array([178,188,255])
    21. # 设置显示的分辨率,设置为320×240 px
    22. usb_cap.set(3, 320)
    23. usb_cap.set(4, 240)
    24. #舵机云台的每个自由度需要4个变量
    25. pid_thisError_x=500 #当前误差值
    26. pid_lastError_x=100 #上一次误差值
    27. pid_thisError_y=500
    28. pid_lastError_y=100
    29. pid_x=0
    30. pid_y=0
    31. # 舵机的转动角度
    32. pid_Y_P = 325
    33. pid_X_P = 325 #转动角度
    34. pid_flag=0
    35. # initialize LED GPIO
    36. redLed = 18 # LED灯
    37. GPIO.setwarnings(False)
    38. GPIO.setmode(GPIO.BCM)
    39. GPIO.setup(redLed, GPIO.OUT)
    40. # 舵机旋转
    41. def Robot_servo(X_P,Y_P):
    42. servo_pwm.set_pwm(5,0,650-pid_X_P)
    43. servo_pwm.set_pwm(4,0,650-pid_Y_P)
    44. # 关闭LED
    45. GPIO.output(redLed, GPIO.LOW)
    46. ledOn = False
    47. # loop over the frames from the video stream
    48. while True:
    49. ret,frame = usb_cap.read()
    50. #高斯模糊处理
    51. frame=cv2.GaussianBlur(frame,(5,5),0)
    52. hsv= cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    53. #ROI及找到形态学找到小球进行处理
    54. mask=cv2.inRange(hsv,ball_yellow_lower,ball_yellow_upper) # 掩膜处理
    55. mask=cv2.erode(mask,None,iterations=2)
    56. mask=cv2.dilate(mask,None,iterations=2)
    57. mask=cv2.GaussianBlur(mask,(3,3),0)
    58. res=cv2.bitwise_and(frame,frame,mask=mask)
    59. cnts=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2] #发现小球
    60. # only proceed if at least one contour was found
    61. if len(cnts) > 0:
    62. cap_cnt=max(cnts,key=cv2.contourArea)
    63. (pid_x,pid_y),radius=cv2.minEnclosingCircle(cap_cnt)
    64. cv2.circle(frame,(int(pid_x),int(pid_y)),int(radius),(255,0,255),2)
    65. # 误差值处理
    66. pid_thisError_x=pid_x-160
    67. pid_thisError_y=pid_y-120
    68. #PID控制参数
    69. pwm_x = pid_thisError_x*3+1*(pid_thisError_x-pid_lastError_x)
    70. pwm_y = pid_thisError_y*3+1*(pid_thisError_y-pid_lastError_y)
    71. #迭代误差值操作
    72. pid_lastError_x = pid_thisError_x
    73. pid_lastError_y = pid_thisError_y
    74. pid_XP=pwm_x/100
    75. pid_YP=pwm_y/100
    76. # pid_X_P pid_Y_P 为最终PID值
    77. pid_X_P=pid_X_P+int(pid_XP)
    78. pid_Y_P=pid_Y_P+int(pid_YP)
    79. GPIO.output(redLed, GPIO.HIGH)
    80. #限值舵机在一定的范围之内
    81. if pid_X_P>650:
    82. pid_X_P=650
    83. if pid_X_P<0:
    84. pid_X_P=0
    85. if pid_Y_P>650:
    86. pid_Y_P=650
    87. if pid_X_P<0:
    88. pid_Y_p=0
    89. # 如果没有检测到球,关闭LED灯
    90. else:
    91. GPIO.output(redLed, GPIO.LOW)
    92. servo_tid=threading.Thread(target=Robot_servo,args=(pid_X_P,pid_Y_P)) # 多线程
    93. servo_tid.setDaemon(True)
    94. servo_tid.start() # 开启线程
    95. cv2.imshow("MAKEROBO Robot", frame) # 显示图像
    96. # 等待键盘输入,如果按下'q'则退出循环
    97. key = cv2.waitKey(1) & 0xFF
    98. if key == ord('q'):
    99. break
    100. # do a bit of cleanup
    101. print("\n [INFO] Exiting Program and cleanup stuff \n")
    102. GPIO.cleanup()
    103. cv2.destroyAllWindows()
    104. usb_cap.stop()

    例程测试步骤:

    用到的程序会统一打包在文后下载

    1、先拍摄一张照片,使用PS软件获取其BGR色域:78 54 208:

    2、再转入HSV色域:(这是大致色域)

    {165,100,100}

    {185,255,255}

    3、放入HSV程序进行微调:得到比较稳定色域:

    {145,161,189}

    {179,196,246}

    4、将HSV色域填入程序:

    然后就能进行测试了:

    例程测试步骤相关工程下载:

    https://download.csdn.net/download/qq_64257614/89521481?spm=1001.2014.3001.5503

    网上查阅资料网址:

    [树莓派基础]12.树莓派OpenCV舵机云台物体位置追踪_哔哩哔哩_bilibili

  • 相关阅读:
    C++ enum与enum class对比
    Python绘图布局设计
    VL53L5CX驱动开发(3)----检测阈值
    灰度级形态学 - 灰度开运算和灰度闭运算
    水文遥测终端(水文遥测终端机)遥测终端机RTU 中小河流水文水雨情自动监测设备
    实验3:左右循环LED灯
    AWD平台搭建及遇到的问题分析
    Linux平台编译WebRTC
    Hadoop学习记录3--HDFS知识补充
    【python学习】Day-023 正则表达式
  • 原文地址:https://blog.csdn.net/qq_64257614/article/details/140240808