小言_互联网的博客

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

383人阅读  评论(0)

目录

流程

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

(一)滚动条获取阈值 

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

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

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

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


流程

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


转载:https://blog.csdn.net/weixin_54627824/article/details/127472819
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场