opencv 動體追蹤

2021-10-02 05:44:45 字數 4474 閱讀 3520

直接上**

# coding: utf-8

import cv2

import psutil

import threading

video = cv2.videocapture(0)

# video = cv2.videocapture(r'e:\aicamera\6773897721212085802.mp4')

# knn背景分割器,設定陰影檢測

background =

none

while

true

: ret, frame = video.read(

)#將第一幀作為背景影象

if background is

none

: background = frame

continue

frame_gray = cv2.cvtcolor(frame, cv2.color_bgr2gray)

background_gray = cv2.cvtcolor(background, cv2.color_bgr2gray)

cv2.imshow(

'frame-gray'

, frame_gray)

cv2.imshow(

'background-gray'

, background_gray)

#影象與背景做減法

diff = cv2.absdiff(frame_gray, background_gray)

cv2.imshow(

'diff'

, diff)

#求做了減法之後的二值化處理

threshold = cv2.threshold(diff,20,

255, cv2.thresh_binary)[1

] cv2.imshow(

'threshold'

, threshold)

#影象腐蝕濾波降噪----取出影象中的小噪點,使得顏色更加突出

""" src 輸入的影象名字;通道的數目可以是任意的,但深度應該是cv_8u、cv_16u、cv_16、cv_32f或cv_64f。

dst 輸出與輸入相同大小和型別的影象.

kernel 用於侵蝕的結構元素;如果元素=mat(),則使用3 x 3矩形結構元素。可以使用getstructuringelement來建立結構元素。。

anchor 結構元素的錨點位置,預設值value(-1,-1)表示錨點位於結構元素中心

iterations 腐蝕操作被遞迴執行的次數

bordertype 推斷邊緣型別,可參考bordertypes

bordervalue 在邊框不變的情況下的邊界值

getstructuringelement()

矩形:morph_rect;

交叉形:morph_cross;

橢圓形:morph_ellipse;

第二和第三個引數分別是核心的尺寸以及錨點的位置。一般在呼叫erode以及dilate函式之前,先定義乙個mat型別的變數來獲得

"""kernel_ercode = cv2.getstructuringelement(cv2.morph_rect,(11

,11))

kernel_dilate = cv2.getstructuringelement(cv2.morph_rect,(5

,5))

# ercode = cv2.erode(threshold, none)

# cv2.imshow('ercode', ercode)

#高斯平滑濾波

gas = cv2.gaussianblur(threshold,(25

,25),

0)cv2.imshow(

'gas'

, gas)

#膨脹影象

dilate = cv2.dilate(gas, kernel_dilate, iterations=5)

cv2.imshow(

'dilate'

, dilate)

#查詢輪廓並且繪製出輪廓

contours, hierarchy = cv2.findcontours(diff.copy(

)for c in contours:

if cv2.contourarea(c)

>

2500

:# 繪製目標矩形框

(x, y, w, h)

= cv2.boundingrect(c)

cv2.rectangle(frame,

(x, y)

,(x+w, y+h),(

255,

255,0)

,2) cv2.imshow(

'frame'

, frame)

if cv2.waitkey(10)

&0xff

==ord

('q'):

break

video.release(

)cv2.destroyallwindows(

)

「」「

知識點:

腐蝕 :

腐蝕操作會把前景物體的邊緣腐蝕掉。原理是卷積核沿著影象滑動,如果與卷積核對應的原影象畫素值都是1,那麼中心元素保持原值,否則為0

.效果,靠近前景的畫素被腐蝕為0,前景物體變小,影象白色區域減少,對於去除白雜訊很有用,可以斷開兩個連線在一起的物體。

膨脹 :

與腐蝕相反,卷積核當中只要有乙個值是1,中心元素值就是1。此操作會增加前景中的白色區域,一般在去雜訊的時候都是先腐蝕再膨脹,腐蝕的過程會使得前景變小,使用膨脹操作使前景變換回來。膨脹也可以使相互分離的物體連線。

腐蝕的作用是消除物體的邊界點,使目標縮小,這個根據操作的過程可以顯然的想到,物體的邊界處畫素值肯定是有0和1,腐蝕操作後這些緊鄰著為1的畫素點都會變成0,所以腐蝕操作會消除那些小的且無意義的物體,使邊界向內部收縮的過程。

相反,膨脹(dilate)的作用當然是使目標增大,填充物體內細小的空洞,並且平滑物體的邊界,邊界向外部擴張的作用。

開運算是先腐蝕(erode)後膨脹(dilate)的過程,可以消除影象上細小的雜訊,並平滑物體的邊界

閉運算是先膨脹(dilate)後腐蝕(erode)的過程,可以填充物體內細小的空洞,並平滑物體邊界

」「」import cv2

video = cv2.videocapture(0)

# video = cv2.videocapture(r'e:\aicamera\6773897721212085802.mp4')

# knn背景分割器,設定陰影檢測

bs = cv2.createbackgroundsubtractorknn(detectshadows=

true

)while

true

: ret, frame = video.read(

) fgmask = bs.

(frame)

# 影象閾值化

th = cv2.threshold(fgmask.copy(),

244,

255, cv2.thresh_binary)[1

] erode = cv2.erode(th,(21

,21), iterations=1)

# 膨脹影象,減少錯誤

dilated = cv2.dilate(erode, cv2.getstructuringelement(cv2.morph_ellipse,(5

,5))

, iterations=2)

# 得到影象中的目標輪廓

for c in contours:

if cv2.contourarea(c)

>

1500

:# 繪製目標矩形框

(x, y, w, h)

= cv2.boundingrect(c)

cv2.rectangle(frame,

(x, y)

,(x+w, y+h),(

255,

255,0)

,2) cv2.imshow(

'mog'

, fgmask)

cv2.imshow(

'thresh'

, th)

cv2.imshow(

'erode'

, erode)

cv2.imshow(

'dilated'

, dilated)

cv2.imshow(

'detection'

, frame)

if cv2.waitkey(10)

&0xff

==ord

('q'):

break

video.release(

)cv2.destroyallwindows(

)

OpenCV學習筆記 物體追蹤

讀取影象,獲得bgr格式的畫素值,然後轉換成hsv格式,再利用inrange函式進行顏色分離,標記出來 hsv的色彩取值範圍 h hue通道,色調,顏色種類 s saturation 飽和度,顏色濃淡 v value 明度,顏色明亮度 inrange函式 inrange src,lowerb,upp...

Eye Tracking 一 眼動追蹤概述

顧名思義就是追蹤眼睛的運動。準確來講就是通過影象處理技術,定位瞳孔位置,獲取瞳孔中心座標,並通過某種方法,計算人的注視點,讓電腦知道你正在看什麼。目前大部分vr裝置或者應用需要使用者用手進行操作,時間長了以後就會感覺疲勞,而眼睛部分的肌肉對疲勞免疫 因為正常情況下,我們不覺得動一下眼睛是很累的事情 ...

mac跑opencv的kcf追蹤

安裝帶有opencv contrib的opencv,具體方式見 和opencv contrib的版本要一致,但是3.2.0有問題,用3.1.0。make的時候會報錯 fatal error qtkit qtkit.h file not found 參考解讀 解決 把cmake gui裡面的dbuil...