【树莓派编程】检测有没有物体移动 +人脸识别
生活随笔
收集整理的這篇文章主要介紹了
【树莓派编程】检测有没有物体移动 +人脸识别
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
檢測(cè)有沒(méi)有物體移動(dòng)
import cv2 import timecamera = cv2.VideoCapture(0) if camera is None:print('請(qǐng)先連接攝像頭')exit()fps = 5 # 幀率 pre_frame = None # 總是取前一幀做為背景(不用考慮環(huán)境影響) play_music = Falsewhile True:start = time.time()res, cur_frame = camera.read()if res != True:breakend = time.time()seconds = end - startif seconds < 1.0/fps:time.sleep(1.0/fps - seconds)cv2.imshow('img', cur_frame)key = cv2.waitKey(30) & 0xffif key == 27:breakgray_img = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)gray_img = cv2.resize(gray_img, (500, 500))gray_img = cv2.GaussianBlur(gray_img, (21, 21), 0)if pre_frame is None:pre_frame = gray_imgelse:img_delta = cv2.absdiff(pre_frame, gray_img)thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]thresh = cv2.dilate(thresh, None, iterations=2)image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:if cv2.contourArea(c) < 1000: # 設(shè)置敏感度continueelse:#print(cv2.contourArea(c))print("前一幀和當(dāng)前幀不一樣了, 有什么東西在動(dòng)!")play_music = Truebreakpre_frame = gray_imgcamera.release() cv2.destroyAllWindows()?
加入人臉識(shí)別
import cv2 import timesave_path = './face/' face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')camera = cv2.VideoCapture(0) # 參數(shù)0表示第一個(gè)攝像頭# 判斷視頻是否打開 if (camera.isOpened()):print('Open') else:print('攝像頭未打開')# 測(cè)試用,查看視頻size size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) print('size:'+repr(size))fps = 5 # 幀率 pre_frame = None # 總是取視頻流前一幀做為背景相對(duì)下一幀進(jìn)行比較 i = 0 while True:start = time.time()grabbed, frame_lwpCV = camera.read() # 讀取視頻流gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY) # 轉(zhuǎn)灰度圖if not grabbed:breakend = time.time()# 人臉檢測(cè)部分faces = face_cascade.detectMultiScale(gray_lwpCV, 1.3, 5)for (x, y, w, h) in faces:cv2.rectangle(frame_lwpCV, (x, y), (x + w, y + h), (255, 0, 0), 2)roi_gray_lwpCV = gray_lwpCV[y:y + h // 2, x:x + w] # 檢出人臉區(qū)域后,取上半部分,因?yàn)檠劬υ谏线叞?#xff0c;這樣精度會(huì)高一些roi_frame_lwpCV = frame_lwpCV[y:y + h // 2, x:x + w]cv2.imwrite(save_path + str(i) + '.jpg', frame_lwpCV[y:y + h, x:x + w]) # 將檢測(cè)到的人臉寫入文件i += 1eyes = eye_cascade.detectMultiScale(roi_gray_lwpCV, 1.03, 5) # 在人臉區(qū)域繼續(xù)檢測(cè)眼睛for (ex, ey, ew, eh) in eyes:cv2.rectangle(roi_frame_lwpCV, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2)cv2.imshow('lwpCVWindow', frame_lwpCV)# 運(yùn)動(dòng)檢測(cè)部分seconds = end - startif seconds < 1.0 / fps:time.sleep(1.0 / fps - seconds)gray_lwpCV = cv2.resize(gray_lwpCV, (500, 500))# 用高斯濾波進(jìn)行模糊處理,進(jìn)行處理的原因:每個(gè)輸入的視頻都會(huì)因自然震動(dòng)、光照變化或者攝像頭本身等原因而產(chǎn)生噪聲。對(duì)噪聲進(jìn)行平滑是為了避免在運(yùn)動(dòng)和跟蹤時(shí)將其檢測(cè)出來(lái)。gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0) # 在完成對(duì)幀的灰度轉(zhuǎn)換和平滑后,就可計(jì)算與背景幀的差異,并得到一個(gè)差分圖(different map)。還需要應(yīng)用閾值來(lái)得到一幅黑白圖像,并通過(guò)下面代碼來(lái)膨脹(dilate)圖像,從而對(duì)孔(hole)和缺陷(imperfection)進(jìn)行歸一化處理if pre_frame is None:pre_frame = gray_lwpCVelse:img_delta = cv2.absdiff(pre_frame, gray_lwpCV)thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]thresh = cv2.dilate(thresh, None, iterations=2)image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for c in contours:if cv2.contourArea(c) < 1000: # 設(shè)置敏感度continueelse:print("咦,有什么東西在動(dòng)")breakpre_frame = gray_lwpCVkey = cv2.waitKey(1) & 0xFF# 按'q'健退出循環(huán)if key == ord('q'):break # When everything done, release the capture camera.release() cv2.destroyAllWindows()?
用同事做了一下實(shí)驗(yàn),hahahahhhh
附件
https://files.cnblogs.com/files/botoo/%E6%96%87%E4%BB%B6.rar
?
轉(zhuǎn)載于:https://www.cnblogs.com/botoo/p/9722155.html
總結(jié)
以上是生活随笔為你收集整理的【树莓派编程】检测有没有物体移动 +人脸识别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: MICROSOFT IGNITE 201
- 下一篇: mikrotik ros ***借线