1. 程式人生 > >Python-OpenCV運動物體檢測

Python-OpenCV運動物體檢測

運動物體檢查,在移動目標定位和智慧安防系統中有廣泛的應用,它的實現原理:捕獲連續幀之間的變化情況,將每次捕獲的影象進行對比,然後檢查差值影象中的所有斑塊(顏色相近的地方)。

Demo在實現的過程中,首先需要設定“背景幀”,通過捕獲連續幀,比較“背景幀”與其它幀之間的差異,這種方法檢測結果還是挺不錯的,但是若在室外,光線的變化就會引起誤檢測,具有侷限性和干擾性。 

Demo執行效果如下:

Demo實現如下:

import cv2
import numpy as np

camera = cv2.VideoCapture(0) # 引數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()
    # 對幀進行預處理,先轉灰度圖,再進行高斯濾波。
    # 用高斯濾波進行模糊處理,進行處理的原因:每個輸入的視訊都會因自然震動、光照變化或者攝像頭本身等原因而產生噪聲。對噪聲進行平滑是為了避免在運動和跟蹤時將其檢測出來。
    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) # 形態學膨脹

    # 顯示矩形框
    image, contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 該函式計算一幅影象中目標的輪廓
    for c in contours:
        if cv2.contourArea(c) < 1500: # 對於矩形區域,只顯示大於給定閾值的輪廓,所以一些微小的變化不會顯示。對於光照不變和噪聲低的攝像頭可不設定輪廓最小尺寸的閾值
            continue
        (x, y, w, h) = cv2.boundingRect(c) # 該函式計算矩形的邊界框
        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'健退出迴圈
    if key == ord('q'):
        break
# When everything done, release the capture
camera.release()
cv2.destroyAllWindows()