检测多个人脸的OpenCV

时间:2019-03-12 09:07:15

标签: python-2.7 opencv

我正在学习python,所以我尝试使用OpenCV。 程序仅检测一张脸,如果有2张脸,将仅显示一张 这是代码:

def getData(id):
    psg = psgconnect.cursor()
    psg.execute("SELECT name FROM people WHERE id=%s", (Id,))
    cursor = psg.execute("SELECT name FROM people WHERE id=%s", (Id,))
    Data = None
    psgconnect.commit()
    row = psg.fetchone()
    #psgconnect.close()
    return row

while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    face = faceDetect.detectMultiScale(gray, 1.3, 5)
    for(x, y, w, h) in face:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        Id, conf = recognizer.predict(gray[y:y + h, x:x + w])
        data = getData(Id)
     #   if data != None:
    if(conf<50):
        #cv2.putText(img, data[0], (x, y + h), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
        cv2.putText(img, 'nashel', (x, y + h), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
    elif(conf>51):
        cv2.putText(img, 'Unknown', (x, y + h), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
    cv2.imshow("Face", img)
    k = cv2.waitKey(10)
    print("suda doshli")
    if k == 27:
        #psg.close()
        psgconnect.close()
        print("zdes")
    break
cam.release()
input()
cv2.destroyAllWindows()

会发生什么?

1 个答案:

答案 0 :(得分:0)

由于您没有任何答案,即使我不使用OpenCV,我也会尽力帮助您。

首先,您确定OpenCV仅在两张图像中检测到一张脸,还是循环问题?

您可以使用简单的print检查检测到多少张脸:

ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face = faceDetect.detectMultiScale(gray, 1.3, 5)
print len(face)

如果打印为1,则实际上OpenCV如何处理您的图像(在这种情况下,由于对OpenCV一无所知,我真的帮不了您)。但是,当我阅读您的代码时,我感觉有些事情关闭了(即使在您编辑之后),所以我建议您尝试以下操作:

def getData(id):
    psg = psgconnect.cursor()
    psg.execute("SELECT name FROM people WHERE id=%s", (Id,))
    cursor = psg.execute("SELECT name FROM people WHERE id=%s", (Id,))
    Data = None
    psgconnect.commit()
    row = psg.fetchone()
    #psgconnect.close()
    return row

while True:
    ret, img = cam.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    face = faceDetect.detectMultiScale(gray, 1.3, 5)
    for(x, y, w, h) in face:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        Id, conf = recognizer.predict(gray[y:y + h, x:x + w])
        data = getData(Id)
        if(conf<50):
            cv2.putText(img, 'nashel', (x, y + h), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
        elif(conf>51):
            cv2.putText(img, 'Unknown', (x, y + h), cv2.FONT_HERSHEY_PLAIN, 4, (255, 255, 255), 4)
    cv2.imshow("Face", img)
    k = cv2.waitKey(10)
    print("suda doshli")
    if k == 27:
        #psg.close()
        psgconnect.close()
        print("zdes")
        break
cam.release()
input()
cv2.destroyAllWindows()

让我知道怎么回事!


作为旁注:由于您正在学习python并考虑在第一次编辑之前粘贴的代码,因此我想强调一下缩进在python中的重要性。缩进的更改可以完全改变代码的含义,因此了解某些块的缩进方式和原因非常重要。