如何让python在打开cv检测到一个面后执行一个命令?

时间:2017-08-17 09:37:10

标签: python opencv numpy raspberry-pi3 robotics

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

我正在使用Raspberry Pi相机来检测面部,而且我只有在opencv检测到一张脸后,才会发射这种电动Nerf枪。现在,无论是否检测到脸,我的代码都会发射Nerf枪。请告诉我我做错了什么?我认为问题出在{}区域。这是我的所有代码。

程序1,名为cbcnn.py

if len(faces) > 0

程序2,名为cbfd2.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)

3 个答案:

答案 0 :(得分:1)

因为您在定义fire(3)功能后立即fire(tf),所以会触发它。以下命令仅创建一个包含1个字符串值的元组:("fire")。它不会调用消防功能。

if len(faces) > 0:
    ("fire")

如果您只想在检测到面部时触发,请在此IF下移动fire(3),然后将其从顶部移除。

顺便说一句,你在这里导入了另一件事:from cbcnn import fire与你的功能同名。这将覆盖您的函数名称,如果您将fire(3)置于导入行下方,则可能会抛出错误。您可以将触发功能fire(tf)更改为fire_rocket(tf),并将您的fire(3)更改为fire_rocket(3)

或者在你的导入行中添加它(你实际上甚至没有使用它!),你可以保持你的防火功能名称:

from cbcnn import fire as Fire

问题更改后编辑:
修复上面提到的IF并将火(某些数字)放在那里 它触发的原因是因为当你从另一个程序导入一些东西时它会运行整个脚本。因为fire(3)在那里,它会在你导入它时自动调用该函数 为避免这种情况,您必须:

  • 从cbcnn.py中移除其他部分:printfire(3)

或者

  • 将这些部分放在这个IF语句中,只在你自己实际运行cbcnn.py而不是导入它时运行它们:

    if __name__=='__main__':
        print(fire)
        fire(3)
    

答案 1 :(得分:0)

我已经在另一篇文章中回答了你,但是,你要放在哪里:

cv2.rectangle(image,(x,y),(x+w,y+h),(255,0,0),2)

在那里你可以放任何你想要的东西,如果你进入for循环,这意味着你已经检测到了一张脸。正如您在发布的代码中看到的那样,在这种情况下,他们的绘图是一个矩形,但您可以在那里做任何事情,x,y,w和h为您提供检测到的面部的坐标和大小。

答案 2 :(得分:0)

import io
import picamera
import cv2
import numpy
import RPi.GPIO as gpio
import time

#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)"

#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)

    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)


#Save the result image
cv2.imwrite('result.jpg',image)