人脸识别上传ONENET -python
1.介绍
通过OPENCV来识别到人头从而进行拍照保存本地然后再上传到ONENET平台!
2.人脸识别
import numpy as np
import cv2
from time import sleep
import serial
import os
import requests
import threading
#Cascades存放分类器的文件夹
#引入分类器
faceCascade = cv2.CascadeClassifier('/home/pi/cadata/haarcascade_frontalface_default.xml')
#级联分类器有很多种文件可以进行AI检测,haarcascade_frontalface_default.xml就是检测人脸
def face():
cap = cv2.VideoCapture(0)
cap.set(3,640) # set Width
cap.set(4,480) # set Height
i=0
#t=serial.Serial('/dev/ttyAMA0',115200,timeout=0.5)
while True:
ret, img = cap.read()
#vector<Rect> objects;
img = cv2.flip(img, -1)#翻转图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#转换到灰度图(人脸识别和检测都是在灰度图下进行的)
faces = faceCascade.detectMultiScale(
gray, #图像
scaleFactor=1.5, #图片缩小的比例
minNeighbors=5, #每次检测时,对检测点(Scale)周边多少有效点同时检测,类似于卷积算子吧
minSize=(50, 50) #人脸的最小范围,如果比20*20像素小忽略
)#进行人脸检测
if i==0:
flag=0
else:
flag=count
i=1
count=0
#x,y,w,,h为得到的人脸的数据
for (x,y,w,h) in faces:
count+=1
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)#框脸
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
if count!=0 and (flag!=count ):
#cv2.imwrite("/home/pi/dataest/User." +"myface"+".jpg", gray[y:y+h,x:x+w])
cv2.imwrite("/home/pi/dataest/User." + 'myface' + ".jpg", gray[4:480,3:640])#保存图片
print('face number:%d',count)
t.write((str(count)).encode())
cv2.imshow('video',img) #显示
k = cv2.waitKey(20) & 0xff
if k == 27: # press 'ESC' to quit
break
cap.release()
cv2.destroyAllWindows()
3.上传ONENET平台
参考ONENET平台的文档中心的HTTP部分
import numpy as np
import cv2
from time import sleep
import serial
import os
import requests
import threading
#OneNet address
url ="http://api.heclouds.com/bindata"
#OneNet HEADERS
headers={
"Content-Type": "image/jpg",
"api-key": "YOUR API-KEY"
}
#device_id;datastream_id;
querystring ={
"device_id":"YOUR DEVICE-ID","datastream_id":"YOUR DATASTREAM_ID"
}
def send():
while True:
sleep(5)
with open("/home/pi/dataest/User." + 'myface' + ".jpg","rb")as f:
requests.post(url,params=querystring,headers=headers,data=f)
print("success")
4.创建线程
为了实现能够同时识别和上传数据
import threading
threads=[]
t1=threading.Thread(target=face)
threads.append(t1)
t2=threading.Thread(target=send)
threads.append(t2)
5.主运行函数
启动线程,开始运行
if __name__=='__main__':
for t in threads:
t.setDaemon(True)
t.start()