1.准备工作
需要安装opencv与requests库
opencv:
先cmd打开命令行输入pip install opencv-python -i https://mirrors.aliyun.com/pypi/simple/
如下图:
然后,等待几秒钟,会看到如下情况,最后一行Sucessfully installed opencv-python-4.4.0(因为我是最新版的Python3.8所以自动匹配的这个版本,Python版本不同匹配的OpenCV版本不一样):
然后,打开pycham实验一下,输入import cv2 as cv:
运行一下没有问题。安装成功
使用pip list查看已安装的包
requests库:
首先需要找到Scripts文件夹在那个路径下 ,通过cd命令跳进去
然后输入 pip install requests
2.one NET平台的使用
注册:https://open.iot.10086.cn/ai/helpCenter.html#/beginnerHelp?id=1&categoryType=1
找到人脸搜索进入
找到调用方法
3.工作流程
1.图库录入人脸
2.opencv拍摄图片-----保存本地
import cv2
number = 0
count = 0
cap = cv2.VideoCapture(0) #0 或者-1适用于一个摄像头
face = cv2.CascadeClassifier("C:/users/administrator/appdata/local/programs/python/python37/lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml")
if not cap.isOpened(): #判断捕获一个摄像头
print("camera is not opened!!!")
while True: #循环捕获每一帧图片
ret,frame = cap.read() #ret:是否正常返回图像0 1 frame:返回的图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰
faces = face.detectMultiScale(gray)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if not ret:
print("grab frame err!")
break
cv2.imshow('frame',frame)
key = cv2.waitKey(25) #一帧阻塞25ms
count+=1
print(key)
# if cv2.waitKey(25) == 27:
# if key == ord('q'):
if count == 30:
file_name = '%s%d%s' % ('D:/face_test/',number,'.jpeg') # file_name = "D:/face_test/number.jpeg"
number+=1
print(file_name)
cv2.imwrite(file_name, frame)
print("save img ok")
count = 0
#break
cv2.destroyAllWindows()
cap.release() #释放
需要注意的是要opencv分拣器路径,(我使用的是自带的模型,也可以自己训练)
3.获取one NET AI平台token码
import requests
import json
import base64
import random
class SimpleEncode():
keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz~!@#$%^&*()_+-={}[]:;<,>.?/|"
keyLength = len(keyStr)
encryptionA = 17
encryptionB = 8
decodeA = 0
preCountMax = 15
postCount = 5
randomChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop"
randomCharLength = len(randomChar)
#base64字符
ALPHABET = "ABCDEFGHIJKLMN0123456789OPQRSTUVWXYZ+/abcdefghijklmnopqrstuvwxyz"
STANDARD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" # 标准的字符串索引
#找到密钥
for i in range(1,keyLength):
if (encryptionA * i) % keyLength == 1:
decodeA = i
def base64Encode(self,sourceStr):
encode = ""
for ch in base64.b64encode(sourceStr.encode()).decode():
if ch == '=':
encode += '='
else:
for i in range(64):
if ch == self.STANDARD[i]:
encode += self.ALPHABET[i]
return encode
def encrpyt(self,sourceStr):
srcLength = len(sourceStr)
#先加入干扰字符的数量
addCharCount = random.randint(1,self.preCountMax) if srcLength < self.preCountMax else 0
#随机字符
sb = str(addCharCount)+"|"
for i in range(addCharCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)]
sb += sourceStr
#尾部固定增加x个字符
for i in range(self.postCount):
sb += self.randomChar[random.randint(0,self.randomCharLength-1)]
#base64 加密
base64Str = self.base64Encode(sb)
destStr = ''
for i in range(len(base64Str)):
#找到字符所在位置
position = self.keyStr.find(base64Str[i])
#对字符进行转换
y = (self.encryptionA * position + self.encryptionB) % self.keyLength
#找到替换后的字符
destStr += self.keyStr[y]
return destStr
if __name__ == '__main__':
url = 'http://ai.heclouds.com:9090/v1/user/oneNetLogin'
headers = {
'Content-Type': 'application/json',
}
account = '1650337649ljy' # 用户名
password = '123qwe!@#' # 用户密码
simpleencode = SimpleEncode()
data = {'account': account, 'password': simpleencode.encrpyt(password)}
#print(data)
req = requests.post(url, data=json.dumps(data), headers=headers)
print(req.text)
num = req.text.index("Token")#寻找Token"首次出现的位置
num1 = req.text.index("}}")#寻找Token":"首次出现的位置
face_token = req.text[num+8:num1-1]#将此范围内的字符串规格
print(face_token)
4.将获取的token码填入人脸识别请求例程中
import requests
import json
import base64
url = 'http://ai.heclouds.com:9090/v1/aiApi/picture/FACE_RECO_LIB'
headers ={
'Content-Type':'application/json',
'Login-Token':'xxxxxxxxxxxxxxxxx(用户鉴权接口返回结果loginToken)'
}
faceLibId = '123456789098765432,0.7'
file = open('用户上传图片位置','rb')
str = base64.b64encode(file.read()).decode()
file.close()
data = {'param':faceLibId,'picture':[str]}
req = requests.post(url,data=json.dumps(data),headers=headers)
print(req.text)
5.整合
import cv2
import requests
import json
import base64
url = 'http://ai.heclouds.com:9090/v1/aiApi/picture/FACE_RECO_LIB'
headers ={
'Content-Type':'application/json',
'Login-Token':'KEFxfUBxKUax*UmxOEF$K0m6KUK3O0JAKEFxfUBxKUax*UmxOEF$K0m6KUK3O0JAU16_Z16_XE1zQUF3KUBx*UJ0KUmA*Ea1KEBAKUayKEF4*E-y*U1yK0V1OUByKERzQUF1*ER3'
}
faceLibId = '796404311130247168,0.7'
number = 0
count = 0
cap = cv2.VideoCapture(0) #0 或者-1适用于一个摄像头
face = cv2.CascadeClassifier("C:/users/administrator/appdata/local/programs/python/python37/lib/site-packages/cv2/data/haarcascade_frontalface_alt2.xml")
if not cap.isOpened(): #判断捕获一个摄像头
print("camera is not opened!!!")
while True: #循环捕获每一帧图片
ret,frame = cap.read() #ret:是否正常返回图像0 1 frame:返回的图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转灰
faces = face.detectMultiScale(gray)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
if not ret:
print("grab frame err!")
break
cv2.imshow('frame',frame)
key = cv2.waitKey(25) #一帧阻塞25ms
count+=1
print(key)
# if cv2.waitKey(25) == 27:
# if key == ord('q'):
if count == 30:
file_name = '%s%d%s' % ('D:/face_test/',number,'.jpeg') # file_name = "D:/face_test/number.jpeg"
number+=1
print(file_name)
cv2.imwrite(file_name, frame)
print("save img ok")
count = 0
file = open(file_name,'rb')
str = base64.b64encode(file.read()).decode()
file.close()
data = {'param':faceLibId,'picture':[str]}
req = requests.post(url,data=json.dumps(data),headers=headers)
print(req.text)
#break
cv2.destroyAllWindows()
cap.release() #释放
4.python与32进行串口通讯
python端:
import serial
#连接串口
serial = serial.Serial('COM4',115200,timeout=2)
if serial.isOpen():
print ('串口已打开')
data = b'Beking\r\n' #发送的数据
data1=b'hello'
print ('You Send Data:',data1)
while True:
# data =str(serial.read(20),'utf-8') #串口读20位数据
#print(data[7])#10=\r
# num = data.index("\r")
#data = data[0:num]
#data = serial.read(20)
serial.write(data1) #串口写数据
data =str(serial.read(8),'utf-8') #串口读20位数据
print(data)
#break
else:
print ('串口未打开')
#关闭串口
serial.close()
if serial.isOpen():
print ('串口未关闭')
else:
print ('串口已关闭')
32端:
在接收中断后在返回