python+opencv實(shí)現(xiàn)動(dòng)態(tài)物體識(shí)別
注意:這種方法十分受光線(xiàn)變化影響
自己在家拿著手機(jī)瞎晃的成果圖:




源代碼:
# -*- coding: utf-8 -*-
"""
Created on Wed Sep 27 15:47:54 2017
@author: tina
"""
import cv2
import numpy as np
camera = cv2.VideoCapture(0) # 參數(shù)0表示第一個(gè)攝像頭
# 判斷視頻是否打開(kāi)
if (camera.isOpened()):
print('Open')
else:
print('攝像頭未打開(kāi)')
# 測(cè)試用,查看視頻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()
# 對(duì)幀進(jìn)行預(yù)處理,先轉(zhuǎn)灰度圖,再進(jìn)行高斯濾波。
# 用高斯濾波進(jìn)行模糊處理,進(jìn)行處理的原因:每個(gè)輸入的視頻都會(huì)因自然震動(dòng)、光照變化或者攝像頭本身等原因而產(chǎn)生噪聲。對(duì)噪聲進(jìn)行平滑是為了避免在運(yùn)動(dòng)和跟蹤時(shí)將其檢測(cè)出來(lái)。
gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)
gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
# 將第一幀設(shè)置為整個(gè)輸入的背景
if background is None:
background = gray_lwpCV
continue
# 對(duì)于每個(gè)從背景之后讀取的幀都會(huì)計(jì)算其與北京之間的差異,并得到一個(gè)差分圖(different map)。
# 還需要應(yīng)用閾值來(lái)得到一幅黑白圖像,并通過(guò)下面代碼來(lái)膨脹(dilate)圖像,從而對(duì)孔(hole)和缺陷(imperfection)進(jìn)行歸一化處理
diff = cv2.absdiff(background, gray_lwpCV)
diff = cv2.threshold(diff, 148, 255, cv2.THRESH_BINARY)[1] # 二值化閾值處理
diff = cv2.dilate(diff, es, iterations=2) # 形態(tài)學(xué)膨脹
# 顯示矩形框
image, contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 該函數(shù)計(jì)算一幅圖像中目標(biāo)的輪廓
for c in contours:
if cv2.contourArea(c) < 1500: # 對(duì)于矩形區(qū)域,只顯示大于給定閾值的輪廓,所以一些微小的變化不會(huì)顯示。對(duì)于光照不變和噪聲低的攝像頭可不設(shè)定輪廓最小尺寸的閾值
continue
(x, y, w, h) = cv2.boundingRect(c) # 該函數(shù)計(jì)算矩形的邊界框
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()
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python基于雙向鏈表實(shí)現(xiàn)LFU算法
這篇文章主要為大家詳細(xì)介紹了python基于雙向鏈表實(shí)現(xiàn)LFU算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
Python浮點(diǎn)數(shù)四舍五入問(wèn)題的分析與解決方法
這篇文章主要給大家介紹了關(guān)于Python中浮點(diǎn)數(shù)四舍五入問(wèn)題的分析與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
python爬蟲(chóng)學(xué)習(xí)筆記之Beautifulsoup模塊用法詳解
這篇文章主要介紹了python爬蟲(chóng)學(xué)習(xí)筆記之Beautifulsoup模塊用法,結(jié)合實(shí)例形式詳細(xì)分析了python爬蟲(chóng)Beautifulsoup模塊基本功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
詳解Python?Selenium如何獲取鼠標(biāo)指向的元素
這篇文章主要介紹了如何通過(guò)Selenium獲取當(dāng)前鼠標(biāo)指向的元素,本文方法的核心,是借助JavaScript的事件(event)來(lái)獲取鼠標(biāo)所在的元素,感興趣的可以試一試2022-03-03
Django實(shí)現(xiàn)隨機(jī)圖形驗(yàn)證碼的示例
這篇文章主要介紹了Django實(shí)現(xiàn)隨機(jī)圖形驗(yàn)證碼的示例,幫助大家更好的學(xué)習(xí)和使用django框架,感興趣的朋友可以了解下2020-10-10
Python設(shè)計(jì)模式之代理模式實(shí)例
這篇文章主要介紹了設(shè)計(jì)模式中的代理模式Python實(shí)例,需要的朋友可以參考下2014-04-04
使用Python處理Excel文件并將數(shù)據(jù)存儲(chǔ)到PostgreSQL的方法
在日常工作中,我們經(jīng)常會(huì)遇到需要處理大量文件并將數(shù)據(jù)存儲(chǔ)至數(shù)據(jù)庫(kù)或整合到一個(gè)文件的需求,本文將向大家展示如何使用Python處理Excel文件并將數(shù)據(jù)存儲(chǔ)到PostgreSQL數(shù)據(jù)庫(kù)中,需要的朋友可以參考下2024-01-01
python基于Pandas讀寫(xiě)MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了python基于Pandas讀寫(xiě)MySQL數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04

