使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象
生活随笔
收集整理的這篇文章主要介紹了
使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用Python,OpenCV的Meanshift 和 Camshift 算法來查找和跟蹤視頻中的對象
- 1. 效果圖
- 2. 源碼
- 2.1 MeanShift
- 2.2 Camshift(Continuously Adaptive Meanshift)持續自適應性均移
- 3. 參考
這篇博客將介紹如何使用 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 cv2cap = 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_windowimg2 = cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2)cv2.imshow('img2', img2)k = cv2.waitKey(60) & 0xffif k == 27:breakelse:cv2.imwrite(chr(k) + ".jpg", img2)else:breakcv2.destroyAllWindows()
cap.release()
2.2 Camshift(Continuously Adaptive Meanshift)持續自適應性均移
# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持續自適應均移以尋找和追蹤對象
# CAMshift 是 MeanShift的優化,它會持續性的自動調整窗口的大小,并且計算最佳擬合橢圓的方向。它再次應用具有新縮放搜索窗口和先前窗口位置的均值變換,直到達到所需的精度;import numpy as np
import cv2cap = 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) & 0xffif k == 27:breakelse:cv2.imwrite(chr(k) + ".jpg", img2)else:breakcv2.destroyAllWindows()
cap.release()
3. 參考
- https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_video/py_meanshift/py_meanshift.html#meanshift
- https://github.com/opencv/opencv/tree/master/samples/python/tutorial_code/video/meanshift
- 可交互式的Camshift
總結
以上是生活随笔為你收集整理的使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Python,OpenCV,本地二进
- 下一篇: Python可视化——3D绘图解决方案p