python+openCV利用攝像頭實現(xiàn)人員活動檢測
本文實例為大家分享了python+openCV利用攝像頭實現(xiàn)人員活動檢測的具體代碼,供大家參考,具體內(nèi)容如下
1.前言
最近在做個機器人比賽,其中一項要求是讓機器人實現(xiàn)對是否有人員活動的檢測,所以就先拿PC端寫一下,準(zhǔn)備移植到機器人的樹莓派。
2.工具
工具還是簡單的python+視覺模塊openCV,代碼量也比較少。很簡單就可以實現(xiàn)
3.人員檢測的原理
從圖書館借了一本《特征提取與圖像處理(第二版)》,是Mark S.Nixon和Alberto S.Aguado寫的,其中講了跟多關(guān)于檢測圖像運動的方法,我們選取了最簡單的一種。
說的很高大上,簡單的說一下原理。假設(shè)有兩幀不同時間采集的圖像,檢測運動的最簡單方法就是計算圖像差值。也就是說,通過把亮度值相減可以得到變化或者運動;如果沒有發(fā)生運動,相減的結(jié)果就是0;但如果圖像中的目標(biāo)作出的運動,他們的圖像像素亮度值就會發(fā)生變化,相減結(jié)果是一個非0的值
4.開始
(1).我們開啟攝像頭模塊還是利用openCV,如下代碼即可。我們使用的是筆記本電腦自帶的攝像頭(樹莓派想直接用一個USB攝像頭插上而不是用CSI攝像頭,這樣直接移植代碼比較方便)
camera = cv2.VideoCapture(0)
(2).查看一下camera的尺寸,用以下兩個函數(shù)
width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
(3).檢測輪廓還是需要用灰度圖像,不明白的可以看看我以前的文章
gray_pic = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
上一步驟即把圖像灰度化
(4).重點說一下這個FPS的設(shè)置,我用以下寫法,也是參考了一下別人的代碼哈=、=
start = time.time() """ xxxxx中間一部分代碼省略 """ seconds = end - start if seconds < 1.0 / fps: time.sleep(1.0 / fps - seconds)
(5).進行一下高斯濾波模糊處理
這里說一下高斯濾波是一種線性平滑濾波,通俗的講,高斯濾波就是對整幅圖像進行加權(quán)平均的過程,每一個像素點的值,都由其本身和鄰域內(nèi)的其他像素值經(jīng)過加權(quán)平均后得到。我理解的就是一個卷積的過程。
聽著很麻煩但實現(xiàn)很簡單
gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0)
注意(21,21)中必須是奇數(shù),否則會出錯,想具體了解的話有時間單獨寫一篇關(guān)于高斯的文章
(6).計算兩圖片的差
img_delta = cv2.absdiff(pre_frame, gray_pic)
(7).濾波,這個代碼的意思是把灰度圖中33以下的歸為0,33以上的點歸為255
thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1]
(8).利用形態(tài)學(xué)的腐蝕與膨脹(上篇文章講過了,有時間詳細說一下,網(wǎng)上資料也很多)
thresh = cv2.dilate(thresh, None, iterations=2)
(9).findContours檢測物體的輪廓
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 # 定義攝像頭對象,其參數(shù)0表示第一個攝像頭 camera = cv2.VideoCapture(0) # 測試用,查看視頻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("打開攝像頭失敗") break end = time.time() cv2.imshow("capture", frame) # 運動檢測部分,看看是不是5FPS seconds = end - start if seconds < 1.0 / fps: time.sleep(1.0 / fps - seconds) gray_pic = cv2.resize(gray_pic, (480, 480)) # 用高斯濾波進行模糊處理 gray_pic = cv2.GaussianBlur(gray_pic, (21, 21), 0) # 如果沒有背景圖像就將當(dāng)前幀當(dāng)作背景圖片 if pre_frame is None: pre_frame = gray_pic else: # absdiff把兩幅圖的差的絕對值輸出到另一幅圖上面來 img_delta = cv2.absdiff(pre_frame, gray_pic) # threshold閾值函數(shù)(原圖像應(yīng)該是灰度圖,對像素值進行分類的閾值,當(dāng)像素值高于(有時是小于)閾值時應(yīng)該被賦予的新的像素值,閾值方法) thresh = cv2.threshold(img_delta, 30, 255, cv2.THRESH_BINARY)[1] # 用一下腐蝕與膨脹 thresh = cv2.dilate(thresh, None, iterations=2) # findContours檢測物體輪廓(尋找輪廓的圖像,輪廓的檢索模式,輪廓的近似辦法) image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours: # 設(shè)置敏感度 # contourArea計算輪廓面積 if cv2.contourArea(c) < 1000: continue else: print("有人員活動!?。?) # 保存圖像 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()
開啟后動了一下臉,就可以看到輸出啦,并且把照片已經(jīng)保存了下來
效果圖在下面,就不暴露帥氣的外表了
效果還可以,不動的話不會拍照,如果想讓他愚鈍點可以調(diào)節(jié)靈敏度
6.結(jié)語
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python opencv設(shè)置攝像頭分辨率以及各個參數(shù)的方法
- Python基于opencv調(diào)用攝像頭獲取個人圖片的實現(xiàn)方法
- python+opencv打開攝像頭,保存視頻、拍照功能的實現(xiàn)方法
- python版opencv攝像頭人臉實時檢測方法
- 樹莓派用python中的OpenCV輸出USB攝像頭畫面
- Python OpenCV利用筆記本攝像頭實現(xiàn)人臉檢測
- python+opencv+caffe+攝像頭做目標(biāo)檢測的實例代碼
- python+opencv實現(xiàn)攝像頭調(diào)用的方法
- python使用opencv驅(qū)動攝像頭的方法
- python opencv調(diào)用筆記本攝像頭
相關(guān)文章
python中main函數(shù)(主函數(shù))相關(guān)應(yīng)用例子
這篇文章主要介紹了python中main函數(shù)(主函數(shù))相關(guān)應(yīng)用,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-05-05python中tf.boolean_mask()函數(shù)的使用方法詳解
這篇文章主要介紹了python中tf.boolean_mask()函數(shù)的使用方法詳解,?tf.boolean_mask()?函數(shù)的作用是通過布爾值對指定的列的元素進行過濾,需要的朋友可以參考下2023-11-11Python編程使用Selenium模擬淘寶登錄實現(xiàn)過程
這篇文章主要介紹了Python編程使用Selenium模擬淘寶登錄的實現(xiàn)過程示例及解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2021-10-10