使用Python,OpenCV的Meanshift 和 Camshift 算法來查找和跟踪視頻中的對象

程序媛一枚_Shining小美 2021-10-25 20:15:08
使用 python opencv meanshift camshift

使用Python,OpenCV的Meanshift 和 Camshift 算法來查找和跟踪視頻中的對象

這篇博客將介紹如何使用 Meanshift 和 Camshift 算法來查找和跟踪視頻中的對象。

**MeanShift:均移

Camshift(Continuously Adaptive Meanshift)持續自適應性均移**

  • cv2.meanShift(): Meanshift 均移總是能找到一個具有最大像素分布的窗口,並且追踪對象;

  • cv2.CamShift(): CAMshift 是 Meanshift的優化,它會持續性的自動調整窗口的大小,並且計算最佳擬合橢圓的方向。它再次應用具有新縮放搜索窗口和先前窗口比特置的均值變換,直到達到所需的精度;

1. 效果圖

官方示例——Meanshift 均移效果圖如下:

在這裏插入圖片描述

官方示例——CAMshift持續自適應均移效果圖如下:

可以看到Camshift會自動調整框的大小及旋轉,能更好的擬合追踪的對象;

在這裏插入圖片描述

2. 源碼

2.1 MeanShift

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持續自適應均移以尋找和追踪對象
# CAMshift 是 MeanShift的優化,它會持續性的自動調整窗口的大小,並且計算最佳擬合橢圓的方向。它再次應用具有新縮放搜索窗口和先前窗口比特置的均值變換,直到達到所需的精度;
import numpy as np
import cv2
cap = cv2.VideoCapture('images/slow_traffic_small.mp4')
# 獲取視頻的第一幀
ret, frame = cap.read()
# 設置初始窗口比特置
x, y, w, h = 300, 200, 100, 50 # 硬編碼比特置
track_window = (x, y, w, h)
# 對追踪對象設置ROI
roi = frame[y:y + h, x:x + w]
# 只考慮HSV的色調
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# 為了避免由於低光導致的錯誤值,使用 cv2.inRange() 函數丟弃低光值。
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 設置終止標准,10 次迭代或移動至少 1pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while (1):
ret, frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 應用meanshift獲取新比特置
ret, track_window = cv2.meanShift(dst, track_window, term_crit)
# 在圖像上繪制它
x, y, w, h = track_window
img2 = cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
cv2.imshow('img2', img2)
k = cv2.waitKey(60) & 0xff
if k == 27:
break
else:
cv2.imwrite(chr(k) + ".jpg", img2)
else:
break
cv2.destroyAllWindows()
cap.release()
複制代碼

2.2 Camshift(Continuously Adaptive Meanshift)持續自適應性均移

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持續自適應均移以尋找和追踪對象
# CAMshift 是 MeanShift的優化,它會持續性的自動調整窗口的大小,並且計算最佳擬合橢圓的方向。它再次應用具有新縮放搜索窗口和先前窗口比特置的均值變換,直到達到所需的精度;
import numpy as np
import cv2
cap = cv2.VideoCapture('images/slow_traffic_small.mp4')
# 獲取視頻的第一幀
ret, frame = cap.read()
# 設置初始窗口比特置
x, y, w, h = 300, 200, 100, 50 # 硬編碼比特置
track_window = (x, y, w, h)
# 對追踪對象設置ROI
roi = frame[y:y + h, x:x + w]
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 設置終止條件,迭代10次或者至少移動1pt
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while (1):
ret, frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 應用camshift獲取新比特置
# 返回一個旋轉的矩形和框參數(用於在下一次迭代中作為搜索窗口傳遞)
# 它首先應用均值變換。一旦meanshift收斂,它會更新窗口的大小,並且計算最佳擬合橢圓的方向。它再次應用具有新縮放搜索窗口和先前窗口比特置的均值變換。該過程一直持續到滿足所需的精度。
ret, track_window = cv2.CamShift(dst, track_window, term_crit)
# 繪制在圖像上
pts = cv2.boxPoints(ret)
pts = np.int0(pts)
img2 = cv2.polylines(frame, [pts], True, 255, 2)
cv2.imshow('img2', img2)
# cv2.waitKey(0)
k = cv2.waitKey(60) & 0xff
if k == 27:
break
else:
cv2.imwrite(chr(k) + ".jpg", img2)
else:
break
cv2.destroyAllWindows()
cap.release()
複制代碼

3. 參考

版权声明
本文为[程序媛一枚_Shining小美]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/10/20211025201508017l.html

  1. Python + sélénium implémente le téléchargement automatique et la publication d'une démonstration d'instance vidéo courte et belle
  2. Python爬虫能当副业吗?到了哪个层次能接单?解析能挣钱的方式
  3. 大佬今天教你用python制作五款简单又好玩的小游戏
  4. Les reptiles Python peuvent - ils être une entreprise secondaire? À quel niveau les commandes peuvent - elles être reçues? Analyse des moyens de gagner de l'argent
  5. Python+微信小程序开发(五)for指令和上传图片
  6. Python+微信小程序开发(四)页面跳转和获取用户信息
  7. Python+微信小程序开发(三)开发小程序及页面布局
  8. If I had these resources when I first learned python, I wouldn't have been tortured for so long!
  9. If you want to learn Python well, [container / iteratable object / iterator / generator] must learn Python steadily!
  10. 用Python定义一个函数用于比较两个数并返回较大的数
  11. 用Python定義一個函數用於比較兩個數並返回較大的數
  12. Définir une fonction en python pour comparer deux nombres et renvoyer un nombre plus grand
  13. python自定义错误self.args是什么意思
  14. Que signifie Python Custom Error self.args
  15. 用python编写一个用n填充列表的程序
  16. 用python編寫一個用n填充列錶的程序
  17. Écrivez un programme qui remplit la liste avec n en python
  18. 你需要知道的 20 个 Python 技巧
  19. Python development learning how to quickly enter the programming industry
  20. 20 conseils Python que vous devez connaître
  21. python中关于数列删减问题
  22. Python frequently asked questions - PIP install specifies the requirements.txt exported by the poetry, and an error is reported: in -- require hashes mode, all req
  23. Sur le problème de la réduction des séries en python
  24. 关于Python安装的问题(不知道自己下的什么)
  25. What do Python's u, R, B, f mean?
  26. Actual combat! Why is Changjin lake so popular? I use Python to analyze cat eye reviews.
  27. Python用xpath定位正确返回的是返回空值
  28. Python error handling
  29. django_celery_beat的clocked定时任务不触发
  30. Python renvoie une valeur nulle si elle est correctement retournée en utilisant XPath
  31. 关于#python#的问题:sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError)
  32. python + selenium 能定位出来算你厉害
  33. Python + sélénium peut vous localiser.
  34. Python code reading (Chapter 13): check whether the elements in the list are the same
  35. Python online retail data association rule mining Apriori algorithm data visualization
  36. python习题,要求用for循环和if语句。
  37. 用Python获得女友聊天记录,一招解决疑神疑鬼
  38. Obtenez le chat de votre petite amie en python pour résoudre les problèmes
  39. Les exercices Python nécessitent des boucles pour et des énoncés if.
  40. Python code reading (Chapter 13): check whether the elements in the list are the same
  41. 练手练到阅文集团作家中心了,python crawlspider 二维抓取学习
  42. python阶乘和数题,要求用for循环,if语句
  43. Python 求最大幂次,用while循环
  44. L'entraîneur s'est entraîné au centre d'écriture du Groupe Yuewen, Python crawlspider 2D grapping Learning
  45. 这六个Python程序的代码要怎么写
  46. Python calcule la puissance maximale et utilise la Boucle while
  47. python入门:请问怎么避免用户输入相同内容呢
  48. python用迭代法求平方根要求用while循环
  49. Comment écrire le Code de ces six programmes Python
  50. python用迭代法求平方根要求用while循環
  51. Python a besoin d'une Boucle while pour trouver la racine carrée par itération
  52. Démarrer avec Python: Comment puis - je empêcher les utilisateurs d'entrer le même contenu?
  53. 这么多的内置函数能记住吗?对python的68个内置函数分类总结!
  54. 這麼多的內置函數能記住嗎?對python的68個內置函數分類總結!
  55. Est - ce que tant de fonctions intégrées peuvent être mémorisées? Résumé de la classification des 68 fonctions intégrées de Python!
  56. 这么多的内置函数能记住吗?对python的68个内置函数分类总结!
  57. Est - ce que tant de fonctions intégrées peuvent être mémorisées? Résumé de la classification des 68 fonctions intégrées de Python!
  58. python 假设lst=[3,4,12,[6,9,12,24],[12,18,34]]统计list中包含元素12的个数
  59. python 假設lst=[3,4,12,[6,9,12,24],[12,18,34]]統計list中包含元素12的個數
  60. Python suppose que LST = [3,4,12, [6,9,12,24], [12,18,34]] compte le nombre d'éléments 12 dans la Liste