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

news/2024/11/18 23:35:42/

目录

流程

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

(一)滚动条获取阈值 

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

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

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

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


流程

step1:获取橘子的检测框

step2:求取橘子的质心

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

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

步骤:

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

(一)滚动条获取阈值 

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

代码

import cv2
import numpy as npdef nothing(x):passcv2.namedWindow('image')
cv2.createTrackbar('a','image',0,255,nothing)
cv2.createTrackbar('b','image',0,255,nothing)
cv2.createTrackbar('c','image',0,255,nothing)
cv2.createTrackbar('d','image',0,255,nothing)
cv2.createTrackbar('e','image',0,255,nothing)
cv2.createTrackbar('f','image',0,255,nothing)frame = cv2.imread('orange.jpg')
frame = cv2.resize(frame,(700,400))while True:a = cv2.getTrackbarPos('a', 'image')b = cv2.getTrackbarPos('b', 'image')c = cv2.getTrackbarPos('c', 'image')d = cv2.getTrackbarPos('d', 'image')e = cv2.getTrackbarPos('e', 'image')f = cv2.getTrackbarPos('f', 'image')hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)low_orange = np.array([a, b, c])high_orange = np.array([d, e, f])mask = cv2.inRange(hsv_img, low_orange, high_orange)cv2.imshow('image',mask)k = cv2.waitKey(1)&0xffif k==27:break

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

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

import cv2
import numpy as npclass OrangeDetector:def __init__(self):self.low_orange = np.array([10, 152, 89])self.high_orange = np.array([180, 255, 255])def detect(self, frame):hsv_img = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv_img, self.low_orange, self.high_orange)contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)contours = sorted(contours, key=lambda x: cv2.contourArea(x), reverse=True)box = (0, 0, 0, 0)for cnt in contours:(x, y, w, h) = cv2.boundingRect(cnt)box = (x, y, x + w, y + h)breakreturn box

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

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

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

predicted = kf.predict(cx, cy)

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

卡尔曼滤波预测代码

import cv2
from orange_detector import OrangeDetector
from kalmanfilter import KalmanFiltercap = cv2.VideoCapture("orange.mp4")
od = OrangeDetector()
kf = KalmanFilter()while True:ret, frame = cap.read()if ret is False:breakorange_bbox = od.detect(frame)x, y, x2, y2 = orange_bboxcx = int((x + x2) / 2)cy = int((y + y2) / 2)predicted = kf.predict(cx, cy)cv2.circle(frame, (cx, cy), 20, (0, 0, 255), 4)cv2.circle(frame, (predicted[0], predicted[1]), 20, (255, 0, 0), 4)cv2.imshow("Frame", frame)key = cv2.waitKey(10)if key == 27:break


http://www.ppmy.cn/news/763042.html

相关文章

树状数组讲解

现在我们有一个数组,我们需要为这个数组写两个函数。(且需要处理上百万的数据) 修改数组中某一个元素的值求出前 n 个元素的和 我们很容易想到使用暴力遍历 [1, n] 的元素并求和写出。 本文到此结束。 但是太暴力了。在百万的数据量面前显得…

Linux配置redis

Redis安装 远程下载地址:wget http://download.redis.io/releases/redis-6.2.6.tar.gz 第一步 解压redis:tar -zxvf redis-6.2.6.tar.gz 第二部 重命名redis: mv redis-6.2.6 redis 第三步 进入到reids: cd redis 第四步 编译redis:make 配置redis守护进行: vim redis.c…

将Raspberry Pi用作台式PC的17个最佳Raspbian应用

如果要使用Raspberry Pi替代台式机,找到在Raspberry Pi上运行的优秀应用程序很重要。 在撰写本文之前的两天内,我将Raspberry Pi用作台式机。 它向您说明了我发现哪些应用可以用Raspberry Pi替换您的主计算机。 类别最佳应用电子邮件客户端雷鸟图形我的画…

不同内核浏览器的差异以及浏览器渲染简介

转载:http://www.cnblogs.com/imwtr/p/4481092.html 一、简单介绍一下什么是浏览器内核。 浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“解释引擎”,不过我们一般习惯将之称为“浏览器内核”。负责对网页语法的解释&…

vs2010最佳字体配色_2010年50个最佳Windows最佳做法文章

vs2010最佳字体配色 Even though we cover plenty of other topics, Windows has always been a primary focus around here, and we’ve got one of the largest collections of Windows-related how-to articles anywhere. Here’s the fifty best Windows articles that we …

在 Google 工作 10 年,到底能学到啥?

1 前言 今天,无意中看到了这篇文章,颇有些触动。工作,往大了说,是一个人实现自己人生价值的最佳途径;往小了说,是满足我们物质需求的正常方式。因此,做什么工作?在什么公司工作&…

苹果发展到计算机,从天堂到地狱 十分钟看懂AIO兴衰存亡

一体电脑真正被大众所熟知的时间虽然并不长,但短短几年之间,一体电脑行业却经历了从快速发展,到鼎盛,再到衰落的全过程。OEM厂商曾经看好这片土地,也为此付出了诸多努力,但对于消费者而言,一体电…

Mac OS 系统的发展历史

文章目录 System 1.0(1984)System 2.0(1985)System 3.0(1986)System 4.0(1987)System 5.0(1987)System 6.0 (1988)System 7 (1991 )Sy…