Как получить доступ к веб-камере в OpenCV на PythonAnywhere через Javascript? - PullRequest
8 голосов
/ 12 февраля 2020

Я разработал веб-приложение в Django, в котором есть метод просмотра, который содержит код OpevCV, который при запуске открывает веб-камеру пользователя для обнаружения ее лица. Это приложение прекрасно работает на моем локальном сервере, но когда я размещаю его на PythonAnywhere, оно говорит, что камера не найдена, так как мой PA хостинг не обслуживает камеру.
Итак, кто-то предложил мне открыть веб-камеру через javascript, так как она имеет дело с клиентским компьютером, а затем передать его фид на сервер, который является моим хостингом.
Но так как я - ладья ie в Python, я не могу понять, как выполнить вышеупомянутую задачу. Я нашел этот кусок js кода, но я не знаю, как и где добавить это в моем Django приложении.

Код для получения канала с Javascript

var video = document.querySelector("#videoElement");

if (navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({video: true}).then(function(stream) {
      video.srcObject = stream;
  }).catch(function(err0r) {
      console.log("Something went wrong!");
  });
}

Мой Python код для открытия камеры и обнаружения лиц выглядит следующим образом (он работает на локальном сервере)

import cv2

cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

cam = cv2.VideoCapture(0)


while True:
    ret, frame = cam.read()
    frame = cv2.flip(frame, 1)

    if ret:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

        for (x, y, w, h) in faces:
            cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198))
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

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

        cv2.imshow('Stream', frame)

Любая помощь приветствуется. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Раньше я делал нечто подобное, я использовал следующую схему:

Data flow

Как вы уже знаете, нам нужно javascript, чтобы получить изображение пользователя из ВЭБ-камера. Я нашел статью , которая показывает нам, как это сделать, вы можете использовать только сторону внешнего интерфейса (файл HTML), если вы хотите использовать Django. Это код для получения картинок, кодирования его в base64 (string) и отправки его через websocket.

После этого мы хотим, чтобы Django обслуживал websocket. Раньше я делал это с Flask, а не с Django, но вы можете увидеть, как вы можете создать сервер веб-сокетов, используя django -канал .

Для последнего шага вам нужна функция с вашим кодом OpenCV. Вам нужно декодировать base64 и конвертировать его в opencv

def modify_picture(img_data):
    # decode image
    img = from_b64(img_data)

    # your OpenCV filter
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # encode image to base64
    return to_b64(gray)

И, конечно, вам не нужны while True и cv2.imshow, но возвращать версия base64 вашей новой картинки. Надеюсь, это поможет.


Обновление: я пишу пример кода в моем github . Не в Django, но все же в Python. Надеюсь, это даст вам больше понимания.

0 голосов
/ 22 февраля 2020

Вам нужно получить потоковое видео в реальном времени, используя javascript, а затем передать этот поток в opencv2, чтобы он заработал.

Использование: получить видео в реальном времени в nodejs

Вы получите URL-адрес в виде "http://localhost:3000", который можно использовать в коде python следующим образом:

import cv2

cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')

cam = cv2.VideoCapture('http://localhost:3000')


while True:
    ret, frame = cam.read()
    frame = cv2.flip(frame, 1)

    if ret:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces = cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=3)

        for (x, y, w, h) in faces:
            cropped = cv2.resize(frame[y:y+h, x:x+w], (198,198))
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

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

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