我想编程我的Intel Galileo gen 2,以便它在网络摄像头前显示面孔的数量,并简单地在shell上打印它(使用opencv)。我的代码是工作,但问题是,处理速度真的很慢。它每15秒打印一次数字。这样我也无法检查号码是否正确。有什么办法或者有人做过吗?这是代码…
import cv2
import sys
import time
cascPath = '/media/mmcblk0p1/haarcascade_frontalface_default.xml'
faceCascade = cv2.CascadeClassifier(cascPath)
video_capture = cv2.VideoCapture(0)
while True:
# Capture frame-by-frame
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceCascade.detectMultiScale(
gray,
scaleFactor=1.1,
minNeighbors=5,
minSize=(30, 30),
flags=cv2.cv.CV_HAAR_SCALE_IMAGE
)
print len(faces)
time.sleep(0.033)
虽然它是一个英特尔CPU,但在英特尔伽利略上没有那么多资源(400MHz CPU, 256MB RAM)用于高级计算机视觉算法(如人脸检测)。
我注意到的第一件事是你没有设置捕获维度。我不知道相机的规格是什么,但我猜你是用全分辨率打开相机的。我建议以较低的分辨率打开相机,例如320x240甚至160x120,因为要处理的像素要少得多。
HAAR级联也有点密集(特别是在像Intel Galileo Gen2这样的系统上)。我建议您查看本地二进制模式(LBP)。这些已经在OpenCV中实现了,你可以在这里查看一个LBP c++示例。将其调整到Python API或找到Python API示例应该很容易。LBP级联应该比HAAR级联快。
虽然不太标准,但根据您的相机,您可能有较低级别的访问权限。如果您直接检索灰度图像,或者如果原始颜色流是YUV格式,则仅检索Y通道。这应该会给你一个小小的提升,因为你不再转换色彩空间,但只有在很容易控制相机的情况下才会这样做(或者你有时间和资源去更深入地进行部分提升)。
虽然创建原型比使用Python慢,但您可能还想尝试使用本机c或c++,并检查是否有任何编译器优化标志可以尽可能地利用CPU。
注意:你可以在这里找到一个c++人脸检测的例子。