python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè)
本文實(shí)例為大家分享了python+openCV利用攝像頭實(shí)現(xiàn)人員活動(dòng)檢測(cè)的具體代碼,供大家參考,具體內(nèi)容如下
1.前言
最近在做個(gè)機(jī)器人比賽,其中一項(xiàng)要求是讓機(jī)器人實(shí)現(xiàn)對(duì)是否有人員活動(dòng)的檢測(cè),所以就先拿PC端寫一下,準(zhǔn)備移植到機(jī)器人的樹(shù)莓派。
2.工具
工具還是簡(jiǎn)單的python+視覺(jué)模塊openCV,代碼量也比較少。很簡(jiǎn)單就可以實(shí)現(xiàn)
3.人員檢測(cè)的原理
從圖書館借了一本《特征提取與圖像處理(第二版)》,是Mark S.Nixon和Alberto S.Aguado寫的,其中講了跟多關(guān)于檢測(cè)圖像運(yùn)動(dòng)的方法,我們選取了最簡(jiǎn)單的一種。
說(shuō)的很高大上,簡(jiǎn)單的說(shuō)一下原理。假設(shè)有兩幀不同時(shí)間采集的圖像,檢測(cè)運(yùn)動(dòng)的最簡(jiǎn)單方法就是計(jì)算圖像差值。也就是說(shuō),通過(guò)把亮度值相減可以得到變化或者運(yùn)動(dòng);如果沒(méi)有發(fā)生運(yùn)動(dòng),相減的結(jié)果就是0;但如果圖像中的目標(biāo)作出的運(yùn)動(dòng),他們的圖像像素亮度值就會(huì)發(fā)生變化,相減結(jié)果是一個(gè)非0的值

4.開(kāi)始
(1).我們開(kāi)啟攝像頭模塊還是利用openCV,如下代碼即可。我們使用的是筆記本電腦自帶的攝像頭(樹(shù)莓派想直接用一個(gè)USB攝像頭插上而不是用CSI攝像頭,這樣直接移植代碼比較方便)
camera = cv2.VideoCapture(0)
(2).查看一下camera的尺寸,用以下兩個(gè)函數(shù)
width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
(3).檢測(cè)輪廓還是需要用灰度圖像,不明白的可以看看我以前的文章
gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
上一步驟即把圖像灰度化
(4).重點(diǎn)說(shuō)一下這個(gè)FPS的設(shè)置,我用以下寫法,也是參考了一下別人的代碼哈=、=
start = time.time() """ xxxxx中間一部分代碼省略 """ seconds = end - start if seconds < 1.0 / fps: time.sleep(1.0 / fps - seconds)
(5).進(jìn)行一下高斯濾波模糊處理
這里說(shuō)一下高斯濾波是一種線性平滑濾波,通俗的講,高斯濾波就是對(duì)整幅圖像進(jìn)行加權(quán)平均的過(guò)程,每一個(gè)像素點(diǎn)的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過(guò)加權(quán)平均后得到。我理解的就是一個(gè)卷積的過(guò)程。
聽(tīng)著很麻煩但實(shí)現(xiàn)很簡(jiǎn)單
gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0)
注意(21,21)中必須是奇數(shù),否則會(huì)出錯(cuò),想具體了解的話有時(shí)間單獨(dú)寫一篇關(guān)于高斯的文章
(6).計(jì)算兩圖片的差
img_delta = cv2.absdiff(pre_frame, gray_pic)
(7).濾波,這個(gè)代碼的意思是把灰度圖中33以下的歸為0,33以上的點(diǎn)歸為255
thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1]
(8).利用形態(tài)學(xué)的腐蝕與膨脹(上篇文章講過(guò)了,有時(shí)間詳細(xì)說(shuō)一下,網(wǎng)上資料也很多)
thresh = cv2.dilate(thresh, None, iterations=2)
(9).findContours檢測(cè)物體的輪廓
image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
(10).在while(1)循環(huán)中結(jié)束攝像頭的調(diào)用(按Q結(jié)束)
大家都在用這種方法,直接Copy就好啦
if cv2.waitKey(1) & 0xFF == ord('q'):
break
5.附上源代碼
import cv2
import time
# 定義攝像頭對(duì)象,其參數(shù)0表示第一個(gè)攝像頭
camera = cv2.VideoCapture(0)
# 測(cè)試用,查看視頻size
width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = width,height
#打印一下分辨率
print(repr(size))
#設(shè)置一下幀數(shù)和前背景
fps = 5
pre_frame = None
while (1):
start = time.time()
# 讀取視頻流
ret, frame = camera.read()
# 轉(zhuǎn)灰度圖
gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
if not ret:
print("打開(kāi)攝像頭失敗")
break
end = time.time()
cv2.imshow("capture", frame)
# 運(yùn)動(dòng)檢測(cè)部分,看看是不是5FPS
seconds = end - start
if seconds < 1.0 / fps:
time.sleep(1.0 / fps - seconds)
gray_pic = cv2.resize(gray_pic, (480, 480))
# 用高斯濾波進(jìn)行模糊處理
gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0)
# 如果沒(méi)有背景圖像就將當(dāng)前幀當(dāng)作背景圖片
if pre_frame is None:
pre_frame = gray_pic
else:
# absdiff把兩幅圖的差的絕對(duì)值輸出到另一幅圖上面來(lái)
img_delta = cv2.absdiff(pre_frame, gray_pic)
# threshold閾值函數(shù)(原圖像應(yīng)該是灰度圖,對(duì)像素值進(jìn)行分類的閾值,當(dāng)像素值高于(有時(shí)是小于)閾值時(shí)應(yīng)該被賦予的新的像素值,閾值方法)
thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1]
# 用一下腐蝕與膨脹
thresh = cv2.dilate(thresh, None, iterations=2)
# findContours檢測(cè)物體輪廓(尋找輪廓的圖像,輪廓的檢索模式,輪廓的近似辦法)
image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
# 設(shè)置敏感度
# contourArea計(jì)算輪廓面積
if cv2.contourArea(c) < 1000:
continue
else:
print("有人員活動(dòng)!??!")
# 保存圖像
TI = time.strftime('%Y-%m-%d', time.localtime(time.time()))
cv2.imwrite("D:\\PYthon\\first_j\\" + "JC"+TI+ '.jpg', frame)
break
pre_frame = gray_pic
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# release()釋放攝像頭
camera.release()
# destroyAllWindows()關(guān)閉所有圖像窗口
cv2.destroyAllWindows()

開(kāi)啟后動(dòng)了一下臉,就可以看到輸出啦,并且把照片已經(jīng)保存了下來(lái)

效果圖在下面,就不暴露帥氣的外表了

效果還可以,不動(dòng)的話不會(huì)拍照,如果想讓他愚鈍點(diǎn)可以調(diào)節(jié)靈敏度
6.結(jié)語(yǔ)
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python opencv設(shè)置攝像頭分辨率以及各個(gè)參數(shù)的方法
- Python基于opencv調(diào)用攝像頭獲取個(gè)人圖片的實(shí)現(xiàn)方法
- python+opencv打開(kāi)攝像頭,保存視頻、拍照功能的實(shí)現(xiàn)方法
- python版opencv攝像頭人臉實(shí)時(shí)檢測(cè)方法
- 樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫面
- Python OpenCV利用筆記本攝像頭實(shí)現(xiàn)人臉檢測(cè)
- python+opencv+caffe+攝像頭做目標(biāo)檢測(cè)的實(shí)例代碼
- python+opencv實(shí)現(xiàn)攝像頭調(diào)用的方法
- python使用opencv驅(qū)動(dòng)攝像頭的方法
- python opencv調(diào)用筆記本攝像頭
相關(guān)文章
python 解決flask 圖片在線瀏覽或者直接下載的問(wèn)題
今天小編就為大家分享一篇python 解決flask 圖片在線瀏覽或者直接下載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
Python進(jìn)階Matplotlib庫(kù)圖繪制
這篇文章主要介紹了Python進(jìn)階Matplotlib庫(kù)圖繪制,Matplotlib:是一個(gè)Python的2D繪圖庫(kù),通過(guò)Matplotlib,開(kāi)發(fā)者可以僅需要幾行代碼,便可以生成折線圖,直方圖,條形圖,餅狀圖,散點(diǎn)圖等2022-07-07
keras 讀取多標(biāo)簽圖像數(shù)據(jù)方式
這篇文章主要介紹了keras 讀取多標(biāo)簽圖像數(shù)據(jù)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
用Python進(jìn)行簡(jiǎn)單圖像識(shí)別(驗(yàn)證碼)
這篇文章主要為大家詳細(xì)介紹了用Python進(jìn)行簡(jiǎn)單圖像識(shí)別驗(yàn)證碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
python 去除二維數(shù)組/二維列表中的重復(fù)行方法
今天小編就為大家分享一篇python 去除二維數(shù)組/二維列表中的重復(fù)行方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
Jupyter Notebook添加代碼自動(dòng)補(bǔ)全功能的實(shí)現(xiàn)
這篇文章主要介紹了Jupyter Notebook添加代碼自動(dòng)補(bǔ)全功能的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python隨機(jī)數(shù)用法實(shí)例詳解【基于random模塊】
這篇文章主要介紹了Python隨機(jī)數(shù)用法,結(jié)合實(shí)例形式分析了基于random模塊的各種隨機(jī)數(shù)操作常用技巧,需要的朋友可以參考下2017-04-04
python操作手機(jī)app的實(shí)現(xiàn)步驟
本文主要介紹了python操作手機(jī)app的實(shí)現(xiàn)步驟,本文將結(jié)合實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07

