• 树莓派4B_OpenCv学习笔记15:OpenCv定位物体实时坐标


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

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

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

     Opencv 版本是4.5.1:

    今日学习 OpenCv定位物体实时位置,代码来源是创乐博,这里作学习解释

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

    目录

    完整实例代码贴出:

    实验过程:

    获取小球的准确HSV色域:

    将上一步得到的HSV色域替换在程序中:

    实验结果截图与视频:

    网上查阅资料贴出:


    完整实例代码贴出:

    这个代码实现了圈出指定HSV色彩范围的圆形物体,并打印出其质心在视频帧上的坐标

    并且有LED相关的亮灭操作用于指示是否检测到目标

    1. # -*- coding: utf-8 -*-
    2. from __future__ import print_function # 导入print函数,确保在Python 2和Python 3中都能以兼容的方式使用print。
    3. from imutils.video import VideoStream # 从imutils库中导入VideoStream,用于从摄像头捕获视频帧。
    4. import imutils # 导入imutils库,该库提供了图像和视频处理的实用功能。
    5. import time
    6. import cv2
    7. import os
    8. import RPi.GPIO as GPIO # 导入Raspberry Pi的GPIO库,用于控制GPIO引脚。
    9. Led = 21 # 定义一个变量Led,表示连LED的GPIO引脚编号。
    10. GPIO.setwarnings(False) # 关闭GPIO库的警告信息。
    11. GPIO.setmode(GPIO.BCM) # 设置GPIO引脚编号模式为BCM(Broadcom SOC channel mode)。
    12. GPIO.setup(Led, GPIO.OUT) # 设置GPIO引脚Led为输出模式。
    13. # 定义一个函数,用于打印对象中心的坐标。
    14. def mapObjectPosition (x, y):
    15. print ("[INFO] Object Center coordenates at X0 = {0} and Y0 = {1}".format(x, y))
    16. # 打印一条信息,表示正在等待摄像头预热。
    17. print("[INFO] waiting for camera to warmup...")
    18. vs = VideoStream(0).start() # 创建一个VideoStream对象,并启动它。0表示使用默认的摄像头。
    19. time.sleep(2.0) # 等待2秒,确保摄像头已经预热完成。
    20. colorLower = (9,135,231) # 定义HSV颜色空间的下限,用于颜色过滤。
    21. colorUpper = (31,255,255) # 定义HSV颜色空间的上限,用于颜色过滤。
    22. GPIO.output(Led, GPIO.LOW) # 将Led引脚设置为低电平,关闭LED。
    23. ledOn = False # 定义一个变量ledOn,表示LED是否已打开。
    24. while True:
    25. frame = vs.read() # 从VideoStream中读取一帧图像。
    26. frame = imutils.resize(frame, width=500) # 调整帧的大小,使其宽度为500像素。
    27. frame = imutils.rotate(frame, angle=0) # 旋转帧(虽然在这里旋转角度为0,所以实际上没有旋转)。
    28. hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 将帧从BGR颜色空间转换为HSV颜色空间。
    29. mask = cv2.inRange(hsv, colorLower, colorUpper)# 使用定义的颜色范围创建一个颜色掩码。
    30. mask = cv2.erode(mask, None, iterations=2) # 对掩码进行腐蚀操作,减少噪声。
    31. mask = cv2.dilate(mask, None, iterations=2) # 对掩码进行膨胀操作,确保对象区域被完全覆盖
    32. # 在掩码上查找轮廓。
    33. cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
    34. cv2.CHAIN_APPROX_SIMPLE)
    35. cnts = cnts[0] if imutils.is_cv2() else cnts[1] # 根据OpenCV的版本(2或3/4),选择正确的轮廓列表。
    36. center = None # 初始化一个变量center,用于存储对象的中心坐标。
    37. if len(cnts) > 0: # 如果找到了轮廓...
    38. c = max(cnts, key=cv2.contourArea) # 找到面积最大的轮廓。
    39. ((x, y), radius) = cv2.minEnclosingCircle(c) # 找到该轮廓的最小外接圆,并获取其圆心和半径。
    40. M = cv2.moments(c) # 计算轮廓c的矩,矩是一组值,可以从中推导出对象的形状特征,如面积、质心等。
    41. center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"])) # 使用矩来计算轮廓的质心(或称为中心),并将其存储在变量center中。
    42. if radius > 10: # 如果找到的最小外接圆的半径大于10(一个阈值,可以根据实际情况调整):
    43. cv2.circle(frame, (int(x), int(y)), int(radius),(0, 255, 255), 2) # 在原帧上绘制找到的最小外接圆,颜色为青色(BGR中的(0, 255, 255)),线宽为2。
    44. cv2.circle(frame, center, 5, (0, 0, 255), -1) # 在原帧上绘制轮廓的质心(或中心),颜色为红色(BGR中的(0, 0, 255)),并填充。
    45. mapObjectPosition(int(x), int(y)) # 调用之前定义的函数,打印对象中心的坐标。
    46. if not ledOn: # 如果LED灯之前没打开(ledOn为False),则将其打开,并将ledOn设置为True。
    47. GPIO.output(Led, GPIO.HIGH)
    48. ledOn = True
    49. elif ledOn: # 如果没有找到轮廓,但LED灯是打开的(ledOn为True):关闭LED灯,并将ledOn设置为False。
    50. GPIO.output(Led, GPIO.LOW)
    51. ledOn = False
    52. cv2.imshow("Frame", frame) # 使用OpenCV的imshow函数显示处理后的帧。
    53. key = cv2.waitKey(1) & 0xFF # 如果按下的键是Esc键(ASCII码为27),则退出循环。
    54. if key == 27:
    55. break
    56. print("\n [INFO] Exiting Program and cleanup stuff \n") # 打印一条信息,表示程序正在退出并进行清理。
    57. GPIO.cleanup() # 清理GPIO设置,释放资源。
    58. cv2.destroyAllWindows() # 关闭所有OpenCV打开的窗口。
    59. vs.stop() # 停止VideoStream的捕获。

    实验过程:

    代码中所用的大部分函数已经在之前的几篇文章提到过了,就不重复解释了:

    文章网址如下:

    树莓派4B_OpenCv学习笔记9:图片的腐蚀与膨胀-CSDN博客

    树莓派4B_OpenCv学习笔记12:OpenCv颜色追踪_画出轨迹_树莓派opencv颜色识别-CSDN博客树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆-CSDN博客

    获取小球的准确HSV色域:

    因为程序中已经存在了寻找最大轮廓圆的处理,因此即使不使用上一节文章的手动调节HSV的处理也没什么大问题,但我这里为了检测更为准确专用,还是加上了上一节代码的HSV微调操作:

    文章网址如下:

    树莓派4B_OpenCv学习笔记13:OpenCv颜色追踪_程序手动调试HSV色彩空间_检测圆-CSDN博客

    拍摄照片获取BGR颜色空间:160    75    13

    转换为大致的HSV色彩空间:

    再使用之前的颜色小球追踪程序对HSV进行进一步细节调整:

    调整前:

    [97,100,100]

    [117,255,255]

    调整后:

    [92,189,130]

    [117,244,200]

    将上一步得到的HSV色域替换在程序中:

    实验结果截图与视频:

    树莓派4B_OpenCv学习笔记15:OpenCv定位物体

    网上查阅资料贴出:

    [树莓派基础]11.树莓派OpenCV定位物体的实时位置_哔哩哔哩_bilibili

  • 相关阅读:
    访谈-John Carmack-2022
    STC单片机20——DS1302可调电子时钟1602显示proteus仿真
    Vue单文件组件(SFC)规范
    数据结构堆详解
    10种新型网络安全威胁和攻击手法
    Github贡献PR六部曲
    VM系列振弦采集模块启动流程的工作原理
    Linux
    java毕业设计人才招聘网源码+lw文档+mybatis+系统+mysql数据库+调试
    电磁仿真设计RMxprt-6p72s电励磁凸极同步电机分析案例
  • 原文地址:https://blog.csdn.net/qq_64257614/article/details/140024163