На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > Обнаружение лиц на Python с использованием OpenCV и MySQL , Проблемы с putText и индексами строки profile
      Добрый вечер! Я пишу программу для распознавания лиц, где данные берутся из MySQL, и сделал её с использованием pymysql, но знания pymysql и OpenCV 3.0+ хромают. Я подгонял под нужную мне СУБД и версию OpenCV коды с этого сайта:
      https://dev.to/pranay749254/simple-face-rec...thon-and-opencv
      Причём, первые два благополучно создали фотки и yml-образ, но на этапе распознавания начались проблемы с выводом данных на экран: программа чуть-чуть подвигалась, а потом зависла и выдала ошибки, связанные с putText и индексами строки profile. Сначала попробовал ключи, соответствующие названиям столбцов, на что компилятор "сказал", что нужны значения числового, а не кортежного типа, потом попробовал индексы с цифрами, как в примерах, но появилась ошибка, причину которой я не знаю. Как правильно из БД извлечь строки и разбить их по нужным ключам, а потом передать их в putText?

      insert_or_update.py
      ExpandedWrap disabled
        import cv2
        import numpy as np
        import pymysql
        from pymysql.cursors import DictCursor
         
        faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
        cam = cv2.VideoCapture(0);
         
        def insertOrUpdate(Id, Name, Age, Gen, CR):
            conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4', cursorclass=DictCursor)
            with conn.cursor() as cursor:
                cmd = "SELECT * FROM people WHERE ID=%s"
                cursor.execute(cmd, Id)
                count_row = cursor.rowcount
         
            if (count_row > 0):
                with conn.cursor() as cursor:
                    cmd = "UPDATE people SET Name=%s, Age=%s, Gender=%s, CR=%s WHERE ID=%s"
                    cursor.execute(cmd, (Name, Age, Gen, CR, Id))
                    conn.commit()
            else:
                with conn.cursor() as cursor:
                    cmd = "INSERT INTO people(ID, Name, Age, Gender, CR) Values(%s, %s, %s, %s, %s)"
                    cursor.execute(cmd, (Id, Name, Age, Gen, CR))
                    conn.commit()
         
            conn.close()
         
        Id = input('Enter User Id')
        name = input('Enter User Name')
        age = input('Enter User Age')
        gen = input('Enter User Gender')
        cr = input('Enter User Criminal Records')
        insertOrUpdate(Id, name, age, gen, cr)
        sampleNum = 0
        while(True):
            ret, img = cam.read();
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = faceDetect.detectMultiScale(gray, 1.3, 5);
            for(x, y, w, h) in faces:
                sampleNum = sampleNum + 1;
                cv2.imwrite("dataSet/User." + str(Id) + "." + str(sampleNum) + ".jpg", gray[y:y+h, x:x+w])
                cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
                cv2.waitKey(100);
            cv2.imshow("Face", img);
            cv2.waitKey(1);
            if(sampleNum > 20):
                break;
         
        cam.release()
        cv2.destroyAllWindows()


      training.py
      ExpandedWrap disabled
        import os
        import cv2
        import numpy as np
        from PIL import Image
         
        recognizer = cv2.face.LBPHFaceRecognizer_create();
        path = 'dataSet'
         
        def getImagesWithID(path):
            imagepaths = [os.path.join(path, f) for f in os.listdir(path)]
            faces=[]
            IDs=[]
            for imagepath in imagepaths:
                faceImg = Image.open(imagepath).convert('L');
                faceNp = np.array(faceImg, 'uint8')
                ID = int(os.path.split(imagepath)[-1].split('.')[1])
                faces.append(faceNp)
                IDs.append(ID)
                cv2.imshow("training", faceNp)
                cv2.waitKey(10)
            return np.array(IDs), faces
         
        IDs, faces = getImagesWithID(path)
        recognizer.train(faces, IDs)
        recognizer.write('recognizer/trainningData.yml')
        cv2.destroyAllWindows()


      recognition.py
      ExpandedWrap disabled
        import cv2
        import numpy as np
        import os
        import pymysql
        from pymysql.cursors import DictCursor
         
        faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
        cam = cv2.VideoCapture(0);
        rec = cv2.face.LBPHFaceRecognizer_create();
        rec.read("recognizer/trainningData.yml")
        font = cv2.FONT_HERSHEY_SIMPLEX
         
        def getProfile(id):
            conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4', cursorclass=DictCursor)
            with conn.cursor() as cursor:
                cmd = "SELECT * FROM people WHERE ID=%s"
                cursor.execute(cmd, id)
                rows = cursor.fetchall()
                profile = None
                for row in rows:
                    profile = row
            conn.close()
            return profile
         
        while(True):
            ret, img = cam.read();
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            faces = faceDetect.detectMultiScale(gray, 1.3, 5);
            for(x, y, w, h) in faces:
                cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
                id, conf = rec.predict(gray[y:y+h, x:x+w])
                profile = getProfile(id)
                if(profile != None):
                    cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
                    cv2.putText(img, "Age : " + str(profile[2]), (x, y+h+45), font, (0, 255, 0), 2);
                    cv2.putText(img, "Gender : " + str(profile[3]), (x, y+h+70), font, (0, 255, 0), 2);
                    cv2.putText(img, "Criminal Records : " + str(profile[4]), (x, y+h+95), font, (0, 0, 255), 2);
            cv2.imshow("Face", img);
            if(cv2.waitKey(1)==ord('q')):
                break;
        cam.release()
        cv2.destroyAllWindows()


      Ошибки:
      ExpandedWrap disabled
        D:\Python\python.exe C:/face_detection_mysql/recognition.py
        Traceback (most recent call last):
          File "C:/face_detection_mysql/recognition.py", line 34, in <module>
            cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
        KeyError: 1
        [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
         
        Process finished with exit code -805306369 (0xCFFFFFFF)


      Изображения по ссылкам ниже:
      Результат работы первого кода в PHPMyAdmin
      Папка с проектом
      dataSet
      recognizer
      Пример фоток для тренировки
        Просто вывести строку могу, а присвоить profile, вернуть из функции и поместить в putText - нет, так как нужен тип действительных чисел вместо кортежа.

        test_output.py
        ExpandedWrap disabled
          import cv2
          import numpy as np
          import os
          import pymysql
           
          def getProfile(id):
              conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
              with conn.cursor() as cursor:
                  cmd = "SELECT * FROM people WHERE ID=%s"
                  cursor.execute(cmd, id)
                  for row in cursor:
                      print(row)
              conn.close()
           
          getProfile(1)


        Результат:
        ExpandedWrap disabled
          D:\Python\python.exe C:/face_detection_mysql/test_output.py
          (1, 'Vladimir', 23, 'M', 'None')
           
          Process finished with exit code 0


        recognition.py
        ExpandedWrap disabled
          import cv2
          import numpy as np
          import os
          import pymysql
           
          faceDetect = cv2.CascadeClassifier('haarcascade_frontalface_default.xml');
          cam = cv2.VideoCapture(0);
          rec = cv2.face.LBPHFaceRecognizer_create();
          rec.read("recognizer/trainningData.yml")
          font = cv2.FONT_HERSHEY_SIMPLEX
           
          def getProfile(id):
              conn = pymysql.connect(host='localhost', user='root', password='', db='facebase', charset='utf8mb4')
              with conn.cursor() as cursor:
                  cmd = "SELECT * FROM people WHERE ID=%s"
                  cursor.execute(cmd, id)
                  profile = None
                  for row in cursor:
                      profile = row
              conn.close()
              return profile
           
          while(True):
              ret, img = cam.read();
              gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
              faces = faceDetect.detectMultiScale(gray, 1.3, 5);
              for(x, y, w, h) in faces:
                  cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
                  id, conf = rec.predict(gray[y:y+h, x:x+w])
                  profile = getProfile(id)
                  if(profile != None):
                      cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
                      cv2.putText(img, "Age : " + str(profile[2]), (x, y+h+45), font, (0, 255, 0), 2);
                      cv2.putText(img, "Gender : " + str(profile[3]), (x, y+h+70), font, (0, 255, 0), 2);
                      cv2.putText(img, "Criminal Records : " + str(profile[4]), (x, y+h+95), font, (0, 0, 255), 2);
              cv2.imshow("Face", img);
              if(cv2.waitKey(1)==ord('q')):
                  break;
          cam.release()
          cv2.destroyAllWindows()


        Результат:
        ExpandedWrap disabled
          D:\Python\python.exe C:/face_detection_mysql/recognition.py
          Traceback (most recent call last):
            File "C:/face_detection_mysql/recognition.py", line 32, in <module>
              cv2.putText(img, "Name : " + str(profile[1]), (x, y+h+20), font, (0, 255, 0), 2);
          TypeError: must be real number, not tuple
          [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback
           
          Process finished with exit code -805306369 (0xCFFFFFFF)


        Как вернуть массив строк, если в видеопотоке будет несколько лиц? Также я путаюсь в этих индексах - почему к элементам массива profile нельзя обратиться по названиям столбцов?
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0284 ]   [ 15 queries used ]   [ Generated: 19.03.24, 02:46 GMT ]