我正在建造一个机器人。我的几乎所有代码都是从教程的其他人的项目中复制而来的。
我正在使用Raspberry Pi摄像头来检测人脸,并且只有在opencv检测到人脸后,我才拥有要发射的Nerf电子枪。现在,无论是否检测到面部,我的代码都会发射Nerf枪。请告诉我我做错了什么?我认为问题出在if len(faces) > 0
区域。这是我所有的代码。
程序1,名为cbcnn.py
import RPi.GPIO as gpio
import time
def init():
gpio.setmode(gpio.BOARD)
gpio.setup(22, gpio.OUT)
def fire(tf):
init()
gpio.output(22, True)
time.sleep(tf)
gpio.cleanup()
print 'fire'
fire(3)
程序2,称为cbfd2.py
import io
import picamera
import cv2
import numpy
from cbcnn import fire
#Create a memory stream so photos doesn't need to be saved in a file
stream = io.BytesIO()
#Get the picture (low resolution, so it should be quite fast)
#Here you can also specify other parameters (e.g.:rotate the image)
with picamera.PiCamera() as camera:
camera.resolution = (320, 240)
camera.vflip = True
camera.capture(stream, format='jpeg')
#Convert the picture into a numpy array
buff = numpy.fromstring(stream.getvalue(), dtype=numpy.uint8)
#Now creates an OpenCV image
image = cv2.imdecode(buff, 1)
#Load a cascade file for detecting faces
face_cascade = cv2.CascadeClassifier('/home/pi/cbot/faces.xml /haarcascade_frontalface_default.xml')
#Convert to grayscale
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#Look for faces in the image using the loaded cascade file
faces = face_cascade.detectMultiScale(gray, 1.1, 5)
print "Found "+str(len(faces))+" face(s)"
if len(faces) > 0:
("fire")
#Draw a rectangle around every found face
for (x,y,w,h) in faces:
cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)
#Save the result image
cv2.imwrite('result.jpg',image)
最佳答案
之所以会触发,是因为您在定义fire(3)
函数之后立即拥有一个fire(tf)
。下面的命令仅创建一个具有1个字符串值的元组:("fire")
。它不调用fire函数。
if len(faces) > 0:
("fire")
如果仅在检测到面部时才触发,请将该
fire(3)
移动到此IF下,然后从顶部将其删除。顺便说一句,您要在此处导入另一件事:与函数名称相同的
from cbcnn import fire
。这将覆盖您的函数名称,如果将fire(3)放在导入行下方,则可能会引发错误。在IF下,将您的触发功能fire(tf)
更改为fire_rocket(tf)
,然后将fire(3)
更改为fire_rocket(3)
。或在您的导入行上添加它(实际上您甚至都没有使用过!),您可以按原样保留fire函数名称:
from cbcnn import fire as Fire
更改问题后进行编辑:
修复上面提到的IF,并在其中放火(一些数字)。
触发的原因是,当您从另一个程序导入某些内容时,它将运行整个脚本。由于fire(3)在该处,因此在导入时会自动调用该函数。
为避免这种情况,您必须:
print
和fire(3)
要么
if __name__=='__main__':
print(fire)
fire(3)
关于python - 打开cv检测到人脸后,如何使python执行命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45731536/