logo资料库

基于python的人体状态识别.docx

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
import cv2 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') people_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_fullbody.xml') eye_cascade = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_eye.xml') # 调用摄像头摄像头 cap = cv2.VideoCapture("test.mp4") var = "stand" = def create_neg_list(): with open('neg.txt', 'w') as f: for img in os.listdir('data/myhaar/neg'): line = 'neg/' + img + '\n' f.write(line) def detect_face(img): face_cascade cv2.CascadeClassifier('./cascades/haarcascades/haarcascade_frontalface_default.xml') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) def detect_eyes(img): eye_cascade = cv2.CascadeClassifier('./cascades/haarcascades/haarcascade_eye.xml') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) eyes = eye_cascade.detectMultiScale(gray, 1.03, 5, 0, (40, 40)) for (x, y, w, h) in eyes: img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 1) = def get_images_and_labels(path): image_paths = [os.path.join(path,f) for f in os.listdir(path)] #新建连个 list 用于存放 face_samples = [] ids = [] #遍历图片路径,导入图片和 id 添加到 list 中 for image_path in image_paths: #通过图片路径将其转换为灰度图片 img = Image.open(image_path).convert('L')
#将图片转化为数组 img_np = np.array(img,'uint8') if os.path.split(image_path)[-1].split(".")[-1] != 'jpg': continue #为了获取 id,将图片和路径分裂并获取 id = int(os.path.split(image_path)[-1].split(".")[1]) faces = detector.detectMultiScale(img_np) #将获取的图片和 id 添加到 list 中 for(x,y,w,h) in faces: face_samples.append(img_np[y:y+h,x:x+w]) ids.append(id) return face_samples,ids def LBPHModel(fd, codec, train_path): ''' ------------------- 参数说明: fd, codec, [model_path] fd: Haar-like(人脸特征模型对象) codec: LabelEncoder(标签编码器对象) model_path: 服用模型路径(功能未实现, 没找到读取的函数...) ------------------- 返回: 训练后的模型对象 ''' # 加载当前文件加下所有.jpg 结尾的图片 train_faces = load_imgs(train_path) # 'traom_imgs' # 将所有标签放入编码器进行训练 codec.fit(list(train_faces.keys())) # 创建空的训练集数组 x y train_x, train_y = [], [] # 循环所有训练组 for label, filenames in train_faces.items(): # 循环当前样本组中的图片 for filename in filenames: # 读取图片 image = cv.imread(filename) # 将图片转成灰度图 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) # 获取人脸特征位置
faces = fd.detectMultiScale( gray, 1.1, 2, minSize=(100, 100)) # 循环脸部特征数组 for l, t, w, h in faces: # 将图片中的脸部特征裁剪下来 train_x.append(gray[t:t + h, l:l + w]) # 标签编码结果存储 train_y.append(codec.transform([label])[0]) train_y = np.array(train_y) # 创建 LBPH 人脸检测器 model = cv.face.LBPHFaceRecognizer_create() # 对训练集进行训练 model.train(train_x, train_y) return model while(True): # 获取摄像头拍摄到的画面 ret, frame = cap.read() #faces = classfier.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(3,3)) peoples = people_cascade.detectMultiScale(frame, 2.0, 10) faces = face_cascade.detectMultiScale(frame, 1.3, 5) img = frame # for (x,y,w,h) in peoples: # # img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),5) # 画出人脸框,蓝色,画笔宽度微 for (x,y,w,h) in faces: # 打印坐标 print(x, y) if(y < 60): print("站") var = "stand" elif(y > 300): print("蹲") var = "Squat down" else: print("坐") var = "sit" cv2.putText(img,var,(10,50),cv2.FONT_HERSHEY_PLAIN,2.0,(0,0,255),2) # 画出人脸框,蓝色,画笔宽度微 # img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
# 框选出人脸区域,在人脸区域而不是全图中进行人眼检测,节省计算资源 # face_area = img[y:y+h, x:x+w] # eyes = eye_cascade.detectMultiScale(face_area) # # 用人眼级联分类器引擎在人脸区域进行人眼识别,返回的 eyes 为眼睛坐标列 表 # for (ex,ey,ew,eh) in eyes: # # #画出人眼框,绿色,画笔宽度为 1 cv2.rectangle(face_area,(ex,ey),(ex+ew,ey+eh),(0,255,0),1) # 实时展示效果画面 cv2.imshow('frame',frame) # 每 5 毫秒监听一次键盘动作 if cv2.waitKey(1) & 0xFF == ord('q'): j'ku break # 最后,关闭所有窗口 cap.release()
分享到:
收藏