Mqtt публикует сообщение при обнаружении лица - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над университетским проектом, сочетающим MQTT и распознавание лиц, используя Raspberry Pi.Прежде всего, я хочу сказать, что распознавание лиц работает нормально, когда оно запускается само по себе, но у меня есть кое-что, что мешает мне при применении его с MQTT.

В разделе «Попробовать», когда человека узнают или неизвестны, он публикует очень хорошо каждые 3 секунды.Странно то, что, если я кладу руку перед камерой или выхожу из зоны действия, она продолжает посылать идентификатор последнего человека, которого она узнала.

Я хочу, чтобы он либо ничего не делал, либоне публиковать.

Любая идея или предложение, чтобы это исправить?Заранее спасибо

РЕДАКТИРОВАТЬ 1: В основном, как я понял, это связано с распознаванием лиц.При использовании только кода распознавания лиц с использованием opencv он работает гладко.Но это усложняется, когда я кладу руку перед камерой или ухожу, потому что снимок останавливается на последнем, что он видит, поэтому он продолжает печатать / публиковать то же самое.Пока не нашли способ избежать этого.Любая помощь будет оценена

import cv2
import json
import time
import datetime as dt
import paho.mqtt.client as mqtt


detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
recognizer = cv2.face.LBPHFaceRecognizer_create()

broker = "*****"
port = *****
username = '*****'
password = '*****'


def on_connect(client, userdata, flags, rc):
    print("Connected with code: ", rc)
    client.subscribe('test/#')


def on_message(client, userdata, msg):
    print(str(msg.payload))


client = mqtt.Client("Python1")
client.on_connect = on_connect
client.on_message = on_message

client.username_pw_set(username, password)
client.connect(broker, port, 60)

client.loop_start()
time.sleep(1)


def facerecognizer():

    recognizer.read("trainerdir/training.yml")

    font = cv2.FONT_HERSHEY_SIMPLEX

    # Loading data

    with open('data.json', 'r') as f:
        names = json.load(f)

    # reverse the data
    # NOTE: for k, v !!
    # else it raises error !
    names = {v: k for k, v in names.items()}
    # print(names)
    print("[INFO] Face recognition is starting..")

    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 360)

    try:

        while True:

            ret, img = cap.read()

            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

            faces = detector.detectMultiScale(gray,
                                              scaleFactor=1.3,
                                              minNeighbors=5
                                              # minSize = (20,20)
                                              )

            for (x, y, w, h) in faces:
                cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)

                roi_gray = gray[y:y + h, x:x + w]
                roi_color = img[y:y + h, x:x + w]

                ID, confidence = recognizer.predict(roi_gray)

                if (confidence < 100):

                    ID = names[ID]

                    confidence = "{}%".format(round(100 - confidence))

                    while True:
                        client.publish("Tutorial/", ID + " " + str(dt.datetime.now()))
                        print('ID sent')
                        time.sleep(3)

                    else:
                        client.publish("Tutorial/", 'None')
                        print('ID sent')
                        time.sleep(3)

                    client.loop_forever()

                else:
                    ID = "Unkown"
                    confidence = "{}%".format(round(100 - confidence))
                    print(ID, dt.datetime.now())
                    while True:
                        client.publish("Tutorial/", ID + " " + str(dt.datetime.now()))
                        print('ID sent')
                        time.sleep(3)
                    else:
                        client.publish("Tutorial/", 'None')
                        print('ID sent')
                        time.sleep(3)

                    client.loop_forever()

    # except UnboundLocalError:
    #     print("Error occured. Exitting..")

    except KeyboardInterrupt:
        pass
    except KeyError as K:
        print(K)
        print('[INFO] Name Value is a string and not an integer')

    print("[INFO] Exiting program..")
    cap.release()

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Используя if True: вместо True: я исправил это.Я также удалил subclient.loop_forever (), и он работает нормально.Вот пример кода, который отличается от кода, который я отправил на мой вопрос

   for (x, y, w, h) in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2)

        roi_gray = gray[y:y + h, x:x + w]
        # roi_color = img[y:y + h, x:x + w]

        ID, confidence = recognizer.predict(roi_gray)

        # 0 is 100% accuracy , and 100 is 0% accuracy
        if (confidence < 100):

            ID = names[ID]
            if True:

                subclient.publish("project/IDReceiver", ID + " " + str(dt.datetime.now()))

                print('ID sent')
                time.sleep(3)

            # subclient.loop_forever()

        else:
            ID = "Unknown"
            if True:

                subclient.publish("project/IDReceiver", "Unknown " + str(dt.datetime.now()))

                print('ID sent')
                time.sleep(3)
0 голосов
/ 19 сентября 2018

Из документации по клиентам mqtt вы, похоже, неправильно используете метод client.loop_forever().

http://www.steves -internet-guide.com / loop-python-mqtt-client /

TLDR

  • Использование client.loop(timeout)в цикле для управления обработкой обновлений.
  • Использование client.loop_start() запускает новый поток, который обрабатывает обновления для вас.
  • Использование client.loop_forever() для блокировки и обработки обновлений.

Поскольку вы уже звонили client.loop_start(), вам не нужно звонить loop_forever().Удаление этих вызовов из вашего кода должно решить проблему.

Примечание: ваш вызов time.sleep(3) может быть перемещен в конец цикла, поскольку он должен происходить независимо от того, какой условный путьэто займет.

...