直接上**
# 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...