Попытка модульных алгоритмов обнаружения OpenCV - PullRequest
0 голосов
/ 06 ноября 2018

Я сделал проект с использованием OpenCV для обнаружения лиц. В течение этого года этот проект еще не разросся, поэтому тот факт, что я не смог модульно структурировать свой код, чтобы сделать его более понятным и легким для чтения, вызывает беспокойство.

Я использую видеокамеру для обнаружения лиц, а также изгибов, поэтому OpenCV должен анализировать кадр за кадром в виде цикла:

project_dir = dirname(dirname(__file__))
face_cascade_path = join(project_dir, "haarcascades/haarcascade_frontalface_default.xml")

face_cascade = cv2.CascadeClassifier(face_cascade_path)

while camera.view.isOpened():
    ret_val, frame = camera.view.read()
    frame = cv2.resize(frame, (camera.width, camera.height))


    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.05, 6)
    for (x,y,w,h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255,0,0), 2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = frame[y:y+h, x:x+w]

    cv2.imshow(camera.name, frame)
    cv2.startWindowThread()
    cv2.namedWindow(camera.name, cv2.WINDOW_NORMAL)

    # q to quit
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Как может быть очевидно здесь, я уже пытаюсь максимально модульно это использовать, используя классы для объекта камеры в OpenCV (camera.view), а также назначая классу некоторые другие параметры (такие как camera.width и camera.height). Однако тот факт, что OpenCV для видео должен запускать алгоритм в цикле while для каждого кадра, заставляет меня чувствовать себя крайне ограниченным. Например, если код должен также включать обнаружение глаз, он будет выглядеть примерно так:

project_dir = dirname(dirname(__file__))
face_cascade_path = join(project_dir, "haarcascades/haarcascade_frontalface_default.xml")
eye_cascade_path = join(project_dir, "haarcascades/haarcascade_eye.xml")

face_cascade = cv2.CascadeClassifier(face_cascade_path)
eye_cascade = cv2.CascadeClassifier(eye_cascade_path)

while camera.view.isOpened():
    ret_val, frame = camera.view.read()
    frame = cv2.resize(frame, (camera.width, camera.height))


    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, 1.05, 6)
    for (x,y,w,h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255,0,0), 2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = frame[y:y+h, x:x+w]

        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0,255, 0), 2)

Мне кажется, что если я в дальнейшем буду применять анализ для других объектов или любые другие преобразования с фреймом, код станет более сложным и трудным для использования. Есть ли способ модулировать это, отделить код и сделать его более понятным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...