我正在建造一个机器人。我的几乎所有代码都是从教程的其他人的项目中复制而来的。

我正在使用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)在该处,因此在导入时会自动调用该函数。
为避免这种情况,您必须:
  • 从cbcnn.py中删除其他部分:printfire(3)

  • 要么
  • 将这些部分放在此IF语句中,仅在您实际运行cbcnn.py时运行它们,而不是通过导入来运行它们:
    if __name__=='__main__':
        print(fire)
        fire(3)
    
  • 关于python - 打开cv检测到人脸后,如何使python执行命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45731536/

    10-14 08:33