• 卡尔曼滤波实例——预测橘子的轨迹


    目录

    流程

    一、采用轮廓的方式检测橘子位置

    (一)滚动条获取阈值 

    (二)获取到图像中的包围橘子对应的白色图形的最小矩形框的信息

    二、获取橘子检测框的质心

    三、将质心送入卡尔曼滤波器,获取下一次的质心位置

    四、绘图质心中心的圆圈,让效果直观显示出来 


    流程

    step1:获取橘子的检测框

    step2:求取橘子的质心

    step3:将质心送入卡尔曼滤波器,获取到预测的下一次橘子的质心位置

    一、采用轮廓的方式检测橘子位置

    步骤:

    • 采用OpenCV滚动条来确定阈值
    • 设置高低阈值,利用inRange函数,将图像转为二值图,为方便之后的轮廓提取
    • 使用findContours函数,提取二值图中所有的轮廓,并采用cv2.RETR_TREE,建立轮廓等级树
    • 等级树初始是升序,我们要获取最大的那个轮廓,那么就进行sort降序排序
    • 最后,第一个轮廓的最小外边框的参数就可以用boundingRect获取到了

    (一)滚动条获取阈值 

    视频中截图的一张带有橘子的图

    代码

    1. import cv2
    2. import numpy as np
    3. def nothing(x):
    4. pass
    5. cv2.namedWindow('image')
    6. cv2.createTrackbar('a','image',0,255,nothing)
    7. cv2.createTrackbar('b','image',0,255,nothing)
    8. cv2.createTrackbar('c','image',0,255,nothing)
    9. cv2.createTrackbar('d','image',0,255,nothing)
    10. cv2.createTrackbar('e','image',0,255,nothing)
    11. cv2.createTrackbar('f','image',0,255,nothing)
    12. frame = cv2.imread('orange.jpg')
    13. frame = cv2.resize(frame,(700,400))
    14. while True:
    15. a = cv2.getTrackbarPos('a', 'image')
    16. b = cv2.getTrackbarPos('b', 'image')
    17. c = cv2.getTrackbarPos('c', 'image')
    18. d = cv2.getTrackbarPos('d', 'image')
    19. e = cv2.getTrackbarPos('e', 'image')
    20. f = cv2.getTrackbarPos('f', 'image')
    21. hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    22. low_orange = np.array([a, b, c])
    23. high_orange = np.array([d, e, f])
    24. mask = cv2.inRange(hsv_img, low_orange, high_orange)
    25. cv2.imshow('image',mask)
    26. k = cv2.waitKey(1)&0xff
    27. if k==27:
    28. break

    (二)获取到图像中的包围橘子对应的白色图形的最小矩形框的信息

    检测橘子轮廓最小外边框代码

    1. import cv2
    2. import numpy as np
    3. class OrangeDetector:
    4. def __init__(self):
    5. self.low_orange = np.array([10, 152, 89])
    6. self.high_orange = np.array([180, 255, 255])
    7. def detect(self, frame):
    8. hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    9. mask = cv2.inRange(hsv_img, self.low_orange, self.high_orange)
    10. contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    11. contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True)
    12. box = (0, 0, 0, 0)
    13. for cnt in contours:
    14. (x, y, w, h) = cv2.boundingRect(cnt)
    15. box = (x, y, x + w, y + h)
    16. break
    17. return box

    二、获取橘子检测框的质心

    1. od = OrangeDetector()
    2. orange_bbox = od.detect(frame)
    3. x, y, x2, y2 = orange_bbox
    4. cx = int((x + x2) / 2)
    5. cy = int((y + y2) / 2)

    三、将质心送入卡尔曼滤波器,获取下一次的质心位置

    predicted = kf.predict(cx, cy)

    四、绘图质心中心的圆圈,让效果直观显示出来 

    卡尔曼滤波预测代码

    1. import cv2
    2. from orange_detector import OrangeDetector
    3. from kalmanfilter import KalmanFilter
    4. cap = cv2.VideoCapture("orange.mp4")
    5. od = OrangeDetector()
    6. kf = KalmanFilter()
    7. while True:
    8. ret, frame = cap.read()
    9. if ret is False:
    10. break
    11. orange_bbox = od.detect(frame)
    12. x, y, x2, y2 = orange_bbox
    13. cx = int((x + x2) / 2)
    14. cy = int((y + y2) / 2)
    15. predicted = kf.predict(cx, cy)
    16. cv2.circle(frame, (cx, cy), 20, (0, 0, 255), 4)
    17. cv2.circle(frame, (predicted[0], predicted[1]), 20, (255, 0, 0), 4)
    18. cv2.imshow("Frame", frame)
    19. key = cv2.waitKey(10)
    20. if key == 27:
    21. break

  • 相关阅读:
    MYSQL-->InnoDB引擎底层原理
    C# 给Word中的字符添加强调符号(着重号)
    如何在vector中插入和删除元素?
    无代码资讯|SAP发布低代码平台;钉钉低代码应用数破500万;轻流举办无代码城市论坛......
    Dockerfile学习
    手写RPC框架 第六天 负载均衡
    IBM MQ命令:DEFINE AUTHINFO
    C++ 实现线程安全的map(OpenHarmony源码实现版)
    ubuntu 下安装sqlite3
    Kubernetes概述架构与工作流程简述
  • 原文地址:https://blog.csdn.net/weixin_54627824/article/details/127472819