python 使用 picamera 进行人脸检测 raspberry pi
python face detection raspberry pi with picamera
我是 python 和 opencv 的新手,我正在尝试使用 raspberry pi 构建人脸检测项目。我收到此错误,这是我的代码
追溯(最近调用最后):
File "/home/pi/Desktop/picamera-code/FaceDetection1.0", line 19, in <module>
for frame in
camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
代码:
import numpy as np
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
face_cascade = cv2.CascadeClassifier('/home/pi/Downloads/haarcascade_frontalface_default.xml')
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
img=np.asarray(frame.array)
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),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
问题出在您的 camera.capture_continuos
上。第一个值,输出,不能只是一个数组,因为它像文档所说的那样用无限迭代记录。而不是这个你应该放一个输出文件。如果你想要一个流来捕获它,你也可以使用 io.Bytes。
在此 link 中,它向您解释了有关如何使用框架以及应将输出重定向到何处的示例。
您可以按照 API 文档中的建议进行操作。获取流并截断它以获取您当前获取的图像:
import io
import time
import picamera
with picamera.PiCamera() as camera:
stream = io.BytesIO()
for foo in camera.capture_continuous(stream, format='jpeg'):
# YOURS: for frame in camera.capture_continuous(stream, format="bgr", use_video_port=True):
# Truncate the stream to the current position (in case
# prior iterations output a longer image)
stream.truncate()
stream.seek(0)
if process(stream):
break
如果您将第 11 640、420 行中的部分更改为 160、120,它应该可以工作
正确答案是您需要在循环结束时截断流。添加
rawCapture.truncate(0)
在第一个 for 循环的末尾。
我是 python 和 opencv 的新手,我正在尝试使用 raspberry pi 构建人脸检测项目。我收到此错误,这是我的代码
追溯(最近调用最后):
File "/home/pi/Desktop/picamera-code/FaceDetection1.0", line 19, in <module>
for frame in
camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
代码:
import numpy as np
import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
camera = PiCamera()
camera.resolution = (640, 480)
camera.framerate = 32
rawCapture = PiRGBArray(camera, size=(640, 480))
time.sleep(0.1)
face_cascade = cv2.CascadeClassifier('/home/pi/Downloads/haarcascade_frontalface_default.xml')
for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
img=np.asarray(frame.array)
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),(255,0,0),2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = img[y:y+h, x:x+w]
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
问题出在您的 camera.capture_continuos
上。第一个值,输出,不能只是一个数组,因为它像文档所说的那样用无限迭代记录。而不是这个你应该放一个输出文件。如果你想要一个流来捕获它,你也可以使用 io.Bytes。
在此 link 中,它向您解释了有关如何使用框架以及应将输出重定向到何处的示例。
您可以按照 API 文档中的建议进行操作。获取流并截断它以获取您当前获取的图像:
import io
import time
import picamera
with picamera.PiCamera() as camera:
stream = io.BytesIO()
for foo in camera.capture_continuous(stream, format='jpeg'):
# YOURS: for frame in camera.capture_continuous(stream, format="bgr", use_video_port=True):
# Truncate the stream to the current position (in case
# prior iterations output a longer image)
stream.truncate()
stream.seek(0)
if process(stream):
break
如果您将第 11 640、420 行中的部分更改为 160、120,它应该可以工作
正确答案是您需要在循环结束时截断流。添加
rawCapture.truncate(0)
在第一个 for 循环的末尾。