溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python+OpenCV目標跟蹤實現(xiàn)基本的運動檢測

發(fā)布時間:2020-10-18 18:16:13 來源:腳本之家 閱讀:424 作者:零尾 欄目:開發(fā)技術

目標跟蹤是對攝像頭視頻中的移動目標進行定位的過程,有著非常廣泛的應用。實時目標跟蹤是許多計算機視覺應用的重要任務,如監(jiān)控、基于感知的用戶界面、增強現(xiàn)實、基于對象的視頻壓縮以及輔助駕駛等。

有很多實現(xiàn)視頻目標跟蹤的方法,當跟蹤所有移動目標時,幀之間的差異會變的有用;當跟蹤視頻中移動的手時,基于皮膚顏色的均值漂移方法是最好的解決方案;當知道跟蹤對象的一方面時,模板匹配是不錯的技術。

本文代碼是做一個基本的運動檢測

考慮的是“背景幀”與其它幀之間的差異

這種方法檢測結果還是挺不錯的,但是需要提前設置背景幀,如果是在室外,光線的變化就會引起誤檢測,還是很有局限性的。

Python+OpenCV目標跟蹤實現(xiàn)基本的運動檢測

import cv2
import numpy as np

camera = cv2.VideoCapture(0) # 參數(shù)0表示第一個攝像頭
# 判斷視頻是否打開
if (camera.isOpened()):
  print('Open')
else:
  print('攝像頭未打開')

# 測試用,查看視頻size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
    int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('size:'+repr(size))

es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))
kernel = np.ones((5, 5), np.uint8)
background = None

while True:
  # 讀取視頻流
  grabbed, frame_lwpCV = camera.read()
  # 對幀進行預處理,先轉灰度圖,再進行高斯濾波。
  # 用高斯濾波進行模糊處理,進行處理的原因:每個輸入的視頻都會因自然震動、光照變化或者攝像頭本身等原因而產(chǎn)生噪聲。對噪聲進行平滑是為了避免在運動和跟蹤時將其檢測出來。
  gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)
  gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)

  # 將第一幀設置為整個輸入的背景
  if background is None:
    background = gray_lwpCV
    continue
  # 對于每個從背景之后讀取的幀都會計算其與北京之間的差異,并得到一個差分圖(different map)。
  # 還需要應用閾值來得到一幅黑白圖像,并通過下面代碼來膨脹(dilate)圖像,從而對孔(hole)和缺陷(imperfection)進行歸一化處理
  diff = cv2.absdiff(background, gray_lwpCV)
  diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1] # 二值化閾值處理
  diff = cv2.dilate(diff, es, iterations=2) # 形態(tài)學膨脹

  # 顯示矩形框
  image, contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 該函數(shù)計算一幅圖像中目標的輪廓
  for c in contours:
    if cv2.contourArea(c) < 1500: # 對于矩形區(qū)域,只顯示大于給定閾值的輪廓,所以一些微小的變化不會顯示。對于光照不變和噪聲低的攝像頭可不設定輪廓最小尺寸的閾值
      continue
    (x, y, w, h) = cv2.boundingRect(c) # 該函數(shù)計算矩形的邊界框
    cv2.rectangle(frame_lwpCV, (x, y), (x+w, y+h), (0, 255, 0), 2)

  cv2.imshow('contours', frame_lwpCV)
  cv2.imshow('dis', diff)

  key = cv2.waitKey(1) & 0xFF
  # 按'q'健退出循環(huán)
  if key == ord('q'):
    break
# When everything done, release the capture
camera.release()
cv2.destroyAllWindows()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI