python调用one net AI平台实现人脸识别

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端:

在接收中断后在返回

猜你喜欢

转载自blog.csdn.net/qq_45604814/article/details/112375975