Как исправить адрес ZMQ в использовании ошибки с Django - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь создать простой сайт потокового видео с Django.Я использую cv2 для запуска веб-камеры и ZMQ для передачи данных с клиента на сервер.Я нашел эту ссылку , с которой я написал сетевую часть кода.

Код сам по себе работает нормально, но когда я создаю простой файл HTML, чтобы начатьв прямом эфире через браузер код завершается с этим сообщением об ошибке

zmq.error.ZMQError: Address in use

Я предполагаю, что эта ошибка возникает из-за того, что IP Django использует и IP ZMQ пытается использовать то же самое.Но я не уверен, как исправить эту ошибку.

Пока это мой код

server.py

def start_server():
    context = zmq.Context()
    footage_socket = context.socket(zmq.SUB)
    print('socket created')

    footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))
    footage_socket.bind('tcp://192.168.1.18:5020')

    print('binding complete')
    print('server ready')

    return footage_socket

def recv_content(socket, face_cascade_path):

    cascade = cv2.CascadeClassifier(face_cascade_path)

    while True:
        try:
            data = socket.recv_string()
            img = base64.b64decode(data)
            npimg = np.fromstring(img, dtype=np.uint8)
            frame = cv2.imdecode(npimg, 1)
            print(frame)

            face = cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=3)

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

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

            cv2.imshow("Stream", frame)

        except KeyboardInterrupt:
            cv2.destroyAllWindows()
            break

views.py

from server import *

def index(request):

    face_cascade_path = '../../../TRAINED MODELS/FACE/haarcascade_frontalface_default.xml'
    footage_socket = start_server()
    recv_content(footage_socket, face_cascade_path)

    return render(request, 'index.html')

def start_client(request):
    context = zmq.Context()
    footage_socket = context.socket(zmq.PUB)
    footage_socket.connect('tcp://192.168.1.18:5020')

    print('connected to server')
    print('starting video on client machine')

    camera = cv2.VideoCapture(0)  # init the camera

    while True:
        try:
            grabbed, frame = camera.read()  # grab the current frame
            frame = cv2.resize(frame, (640, 480))  # resize the frame
            frame = cv2.flip(frame, 1)
            encoded, buffer = cv2.imencode('.jpg', frame)
            jpg_as_text = base64.b64encode(buffer)
            footage_socket.send(jpg_as_text)

        except KeyboardInterrupt:
            camera.release()
            cv2.destroyAllWindows()
            break

index.html

<html>
<head>

</head>
<body>
  <div class='container'>
    <h2>CAMERA SERVER CLIENT TEST</h2>

    <p>
    Click the start_client button to start camera. Each frame of the stream is sent to the server.
    </p>
    <p>
      The camera code is running on the client side.
    </p>

    <a href ='start_client/'><button>start client</button></a>

  </div>
</body>
</html>

Пожалуйста, помогите мне.

Заранее спасибо

РЕДАКТИРОВАТЬ 1 - я отредактировал, чтобы добавить клиентскую часть кода и index.html.Функция start_client находится в views.py.Эта функция запускается при нажатии кнопки start_client в index.html

EDIT 2 - я отредактировал вопрос, чтобы добавить скриншот своей проблемы.Хотя я не сталкиваюсь с ошибкой «адрес используется», когда я обновляю страницу после добавления блока try-exc, веб-страница по-прежнему не загружается.

enter image description here

1 Ответ

0 голосов
/ 04 декабря 2018

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

Другая идея заключается в том, что любые опции сокетов должны быть помещены перед методом bind или connect в ZMQ.

Итак, ваш код будет выглядеть примерно так:

def start_server():
    context = zmq.Context()
    footage_socket = context.socket(zmq.SUB)
    footage_socket.setsockopt_string(zmq.SUBSCRIBE, np.unicode(''))

    try:
        footage_socket.bind('tcp://192.168.1.18:5020')  # Another port used.
    except:
        pass

    return footage_socket

[ NOTE ]:

Не забудьте изменить портна стороне клиента (.connect()) до 5020.


[ОБНОВЛЕНИЕ]:

...