1、开箱
Zora P1开发板的包装还是很精致的,除了开发板,还带了一个电源适配器和固定开发板的亚克力板配件。
加上咸鱼淘的奥比Astra深度相机,我就开启了评测之旅~,深度相机长这样子,它除了可以输出RGB图像之外,还可以输出深度图,因此又被叫做RGB-D相机。
2、安装ubuntu系统,然后安装Astra SDK和openNI
Zora P1开发板自带的操作系统为armbian系统,因为之前用树莓派比较多,所以对raspian系统比较熟悉,armbian其实跟树莓派自带的Raspian系统很像。
另外,Zora P1开发板是arm架构的,因此,在下载SDK和各种软件的版本的时候要注意选择Linux Arm64版本的。
3、人脸识别,区分出是人脸图片还是真人
于二维图像来说,要想区分出真人还是人脸图片有很大的难度,准确性难以保证,之前就有拿人脸图片刷开快递柜的新闻出现。而深度相机可以很轻易地让人脸图片现出原形,准确性有可靠保证,对于安防、金融支付这些应用场景来说,深度相机有重要的应用价值。
人脸识别是基于python和OpenCV开发的,过程如流程图所示,用到了openCV中的Haar CascadeClassifier,也就是级联分类器去识别图像中的人脸特征。识别到人脸特征后,还不能确定是否是真正的人脸,因此选取从RGB图像中获得的潜在真正人脸区域,坐标映射到深度图像中,对深度图像中对应的ROI区域计算标准差,设置阈值便能将两者区分开来。因为人脸图片在深度图中各点的深度信息没有变化,标准差很小;而真正的人脸各点深度信息变化明显,标准差大。
ubuntu配置openCV依赖项可以按照这个:https://blog.csdn.net/weixin_44232093/article/details/98937652
除了OpenCV库,我还用到了numpy和openNI,需要pip安装,安装时换成国内的源可以大大加快安装速度,在用清华源pip安装的时候,我遇到因为ubuntu系统时间没调,时间有偏差,导致安装失败的情况,解决方法就是把系统时间调整为北京时间,这样就可以用清华源正常安装python库了。还有一个要注意的就是DNS要设置一下。
4、最后,我想用一下板子上的GPIO引脚
查阅了Zora P1开发板的说明文档,看到是有8个GPIO引脚的,与树莓派相比不是很多。我的想法是实现一个基于人脸深度信息获取的智能风扇,根据之前获得的人脸深度信息,与调节风扇转速的模拟量值建立关系,实现人脸靠近时风速大,远离时风速小的效果。
于是,我便查阅了Linux通过指令控制GPIO的相关内容,操作步骤如下:
(1)定义GPIO:/sys/class/gpio# echo 1 > export,定义好之后在/sys/class/gpio路径下会生成gpio1文件夹。
(2)设置输入/输出:/sys/class/gpio/gpio1# echo out > direction
(3)设置输出值:/sys/class/gpio/gpio1#
echo 1 > value
这里也遇到一个问题,我理所当然的认为8个gpio口对应的编号便是1~8,其实不然,这就导致我定义GPIO是失败的。事实上,Zora P1的GPIO编号应该是在410-495和496-511这两个范围内,但具体的各个引脚软硬件映射关系说明文档没有提供,希望后面能发布出来。
附python代码:
from openni import openni2
import numpy as np
import cv2
def mousecallback(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDBLCLK:
print(y, x, dpt[y,x])
if __name__ == "__main__":
openni2.initialize()
dev = openni2.Device.open_any()
print(dev.get_device_info())
depth_stream = dev.create_depth_stream()
depth_stream.start()
cap = cv2.VideoCapture(0)
cv2.namedWindow('depth')
cv2.setMouseCallback('depth',mousecallback)
face_detector = cv2.CascadeClassifier("/home/orbbec/haarcascade_frontalface_default.xml")
while True:
frame = depth_stream.read_frame()
dframe_data = np.array(frame.get_buffer_as_triplet()).reshape([480, 640, 2])
dpt1 = np.asarray(dframe_data[:, :, 0], dtype='float32')
dpt2 = np.asarray(dframe_data[:, :, 1], dtype='float32')
dpt2 *= 255
dpt = dpt1 + dpt2
cv2.imshow('depth', dpt)
#print(dpt.shape)
ret,frame = cap.read()
img=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
face_rects=face_detector.detectMultiScale(img, 1.3, 5)
for(x,y,w,h) in face_rects:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)
face_dpt=dpt[y:y+h,640-(x+w):640-x] ##the depth image and the frame are horizontal symmetry
##calculate the standard deviation
(mean,stddev)=cv2.meanStdDev(face_dpt)
#print(stddev)
##Set threshold to recognize person true or not
if stddev>300:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),3)
cv2.putText(frame,"Real Person",(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,1,(0,255,0),2)
else:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
cv2.putText(frame,"It's picture!",(x,y-5),cv2.FONT_HERSHEY_SIMPLEX,1,(0,0,255),2)
#if w > 0:
# cv2.imshow('face_dpt', face_dpt)
cv2.imshow('color', frame)
#print(frame.shape)
key = cv2.waitKey(1)
if int(key) == ord('q'):
break
depth_stream.stop()
dev.close()
备注:
点击下面链接,进入奥比中光开发者社区,了解更多3D视觉技术信息:
https://developer.orbbec.com.cn/
或扫描下方二维码,进入奥比中光开发者社区: