日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象

發(fā)布時間:2023/11/27 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

    • 1. 效果圖
    • 2. 源碼
      • 2.1 MeanShift
      • 2.2 Camshift(Continuously Adaptive Meanshift)持續(xù)自適應(yīng)性均移
    • 3. 參考

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

MeanShift:均移
Camshift(Continuously Adaptive Meanshift)持續(xù)自適應(yīng)性均移

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

  • cv2.CamShift(): CAMshift 是 Meanshift的優(yōu)化,它會持續(xù)性的自動調(diào)整窗口的大小,并且計算最佳擬合橢圓的方向。它再次應(yīng)用具有新縮放搜索窗口和先前窗口位置的均值變換,直到達(dá)到所需的精度;

1. 效果圖

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

官方示例——CAMshift持續(xù)自適應(yīng)均移效果圖如下:

可以看到Camshift會自動調(diào)整框的大小及旋轉(zhuǎn),能更好的擬合追蹤的對象;

2. 源碼

2.1 MeanShift

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持續(xù)自適應(yīng)均移以尋找和追蹤對象# CAMshift 是 MeanShift的優(yōu)化,它會持續(xù)性的自動調(diào)整窗口的大小,并且計算最佳擬合橢圓的方向。它再次應(yīng)用具有新縮放搜索窗口和先前窗口位置的均值變換,直到達(dá)到所需的精度;
import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 獲取視頻的第一幀
ret, frame = cap.read()# 設(shè)置初始窗口位置
x, y, w, h = 300, 200, 100, 50  # 硬編碼位置
track_window = (x, y, w, h)# 對追蹤對象設(shè)置ROI
roi = frame[y:y + h, x:x + w]# 只考慮HSV的色調(diào)
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
# 為了避免由于低光導(dǎo)致的錯誤值,使用 cv2.inRange() 函數(shù)丟棄低光值。
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)# 設(shè)置終止標(biāo)準(zhǔn),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)# 應(yīng)用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)持續(xù)自適應(yīng)性均移

# 使用MeanShift均移和 CAMshift(Continuously Adaptive Meanshift)持續(xù)自適應(yīng)均移以尋找和追蹤對象
# CAMshift 是 MeanShift的優(yōu)化,它會持續(xù)性的自動調(diào)整窗口的大小,并且計算最佳擬合橢圓的方向。它再次應(yīng)用具有新縮放搜索窗口和先前窗口位置的均值變換,直到達(dá)到所需的精度;import numpy as np
import cv2cap = cv2.VideoCapture('images/slow_traffic_small.mp4')# 獲取視頻的第一幀
ret, frame = cap.read()# 設(shè)置初始窗口位置
x, y, w, h = 300, 200, 100, 50  # 硬編碼位置
track_window = (x, y, w, h)# 對追蹤對象設(shè)置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)# 設(shè)置終止條件,迭代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)# 應(yīng)用camshift獲取新位置# 返回一個旋轉(zhuǎn)的矩形和框參數(shù)(用于在下一次迭代中作為搜索窗口傳遞)# 它首先應(yīng)用均值變換。一旦meanshift收斂,它會更新窗口的大小,并且計算最佳擬合橢圓的方向。它再次應(yīng)用具有新縮放搜索窗口和先前窗口位置的均值變換。該過程一直持續(xù)到滿足所需的精度。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

總結(jié)

以上是生活随笔為你收集整理的使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。