小白一路按照领导的要求自己摸索的,若有不对之处,还望各位大佬指正。
树莓派4b自带的python版本是2.7的,所以需要我们把这个默认的版本设置改一下,以下的方法借鉴了博客
改变python版本
但是我操作了之后发现需要在命令行键入python3才能进行后续操作,python这个命令就失效了。不过这不会影响太多。
人脸识别基于face_recognition模块,安装这个模块之前需要以下准备。
这是个大坑,我安装了两三天才搞定……大家一定要有耐心2333
【链接】:http://dlib.net/
默认下载位置都是/home/pi/Downloads
首先我们要扩大树莓派的缓存
sudo nano /etc/dphys-swapfile
看到CONF_SWAPSIZE=100
根据下方提示
摁住“CTRL+\”把”CONF_SWAPSIZE=100”
替换为“CONF_SWAPSIZE=1024"
然后保存。
然后我们输入free -m
就可以看到
swap后面已经变为1023.
sudo apt-get update
sudo apt-get install build-essential cmake libgtk-3-dev libboost-all-dev -y
之后:
pip3 install numpy
pip3 install scipy
pip3 install scikit-image
上述的安装顺序不能调换!
然后
sudo pip3 install dlib==19.21
上述这些语句我尝试了好几次才成功,也不知道为什么,所以第一次失败后可以再多尝试几次……
dlib安装成功后,可以直接安装face_recognition
sudo pip3 install face_recognition
最开始我是直接在命令行克隆源码,想克隆源码的可以按照下面链接里的方法尝试。
https://blog.csdn.net/weixin_39760857/article/details/110432603?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161232285016780261990024%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161232285016780261990024&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-110432603.pc_search_result_cache&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E4%B8%8B%E4%B8%BApython3%E5%AE%89%E8%A3%85opencv&spm=1018.2226.3001.4187
但是文件太大,速度太慢,失败了好几次,所以换了另一种方法。
首先我们需要配置opencv的环境
sudo raspi-config #进入后打开摄像头、SSH
sudo apt-get update
sudo apt-get upgrade
sudo rpi-update #这一步我出现了报错,但好像没什么影响
sudo apt-get install build-essential cmake git pkg-config #安装opencv相关工具
sudo apt-get install libjpeg8-dev #安装相关图像工具包
sudo apt-get install libtiff5-dev
sudo apt-get install libjasper-dev
sudo apt-get install libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev #安装视频I/O包
sudo apt-get install libgtk2.0-dev #安装gtk2.0和优化函数包
sudo apt-get install libatlas-base-dev gfortran
在树莓派上下载opencv和opencv_contrib安装包
感谢这位大佬提供的渠道
【链接】:https://www.bzblog.online/wordpress/index.php/2020/03/09/opencvdownload/
下载成功后进行解压
具体操作见下方链接
https://blog.csdn.net/Yumeon/article/details/113624604
解压后进行编译,我参考的是下方链接
https://blog.csdn.net/kyokozan/article/details/79192646?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161239879316780264062504%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=161239879316780264062504&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-79192646.pc_search_result_cache&utm_term=%E6%A0%91%E8%8E%93%E6%B4%BE%E5%AE%89%E8%A3%85opencv&spm=1018.2226.3001.4187
安装成功。
sudo pip3 install pillow
import face_recognition
from PIL import Image,ImageDraw
known_image=face_recognition.load_image_file("1.JPG")
unknown_image=face_recognition.load_image_file("u2.JPG")
biden_encoding = face_recognition.face_encodings(known_image)[0]
unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
print(biden_encoding)
print(unknown_encoding)
results = face_recognition.compare_faces([biden_encoding], unknown_encoding)
if results[0] == True:
print ("Yes!")
else:
print ("No!")
注意:需要将图片与本段代码放到一个文件夹里!
灰度化具体算法是什么我也不太懂,反正我的leader的要求就是把图片由彩色变成黑白的,这样可以提高识别率,那我也简单粗暴地操作了一通……
import face_recognition
from PIL import Image,ImageDraw
import matplotlib.pyplot as plt
import numpy as np
known_image=face_recognition.load_image_file("1.JPG")
unknown_image=face_recognition.load_image_file("u2.JPG")
img1=Image.open("1.JPG").convert('1')
plt.imshow(img1)
plt.axis('off')
plt.ion() #如果使用plt.show(),则展示出来的图片需要我们手动关闭
plt.pause(2) #图片暂停几秒,括号里为你想使其暂停的秒数
plt.close()
img2=Image.open("u2.JPG").convert('1')
plt.imshow(img2)
plt.axis('off')
plt.ion()
plt.pause(2)
plt.close()
known_encoding=face_recognition.face_encodings(known_image)[0]
unknown_encoding=face_recognition.face_encodings(unknown_image)[0]
print(known_encoding)
print(unknown_encoding)
results=face_recognition.compare_faces([known_encoding],unknown_encoding,tolerance=0.4)
if results[0]==True:
print("Yes!")
else:
print("No!")
运行后发现弹出的图片是黑白的。
import cv2 #opencv库
import numpy as np
#加载人脸模型库
face_model=cv2.CascadeClassifier('haarcascade_frontalcatface.xml')
#图片进行灰度处理
gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
#人脸检测
faces = face_model.detectMultiScale(gray)
#标记人脸
for (x,y,w,h) in faces:
#1.原始图片;2坐标点;3.矩形宽高 4.颜色值(RGB);5.线框
cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
#显示图片窗口
cv2.imshow('faces',image)
#窗口暂停
cv2.waitKey(0)
#销毁窗口
cv2.destroyAllWindows()
摄像头(我用的是海康威视的),交换机,路由器
把树莓派,笔记本电脑,摄像头,路由器都用网线接在交换机上,确保它们分配到一个IP地址。
海康威视摄像头默认的IP地址是192.168.1.64,默认用户名是admin,密码自己设置后要记住。
import cv2
def get_img_from_camera_net(folder_path):
# cap = cv2.VideoCapture(0,cv2.CAP_DSHOW) # 打开本地摄像机
cap = cv2.VideoCapture("rtsp://%s:%s@%s//Streaming/Channels/%d" % ('admin','19990909cym' ,'192.168.1.101', 1))
print("rtsp://%s:%s@%s//Streaming/Channels/%d" % ('admin','19990909cym' ,'192.168.1.101', 1))
# ‘admin’,‘密码’,‘IP地址’
i = 1
while i < 10000:
ret, frame = cap.read()
cv2.imshow("capture", frame)
print(str(i))
# cv2.imwrite(folder_path + str(i) + '.jpg', frame) # 存储为图像
if cv2.waitKey(10) & 0xFF == ord('q'):
break
i += 1
cap.release()
cv2.destroyAllWindows()