Кодировать / декодировать данные изображения после замены на / из строки / байтов - PullRequest
1 голос
/ 06 мая 2019

Конечной целью этого является создание программы, работающей на Raspberry Pi, которая может передавать видеоданные на удаленный клиент.Чтобы сделать это, я (полагаю) мне нужно изменить данные фрейма на необработанные байты, чтобы они отправлялись через сокеты.Перед развертыванием этого в реальном мире я просто проверяю, могу ли я выполнить преобразование в байты и из них.Я получаю вывод, и он читает данные с камеры в режиме реального времени, но способ отображения - вертикальная линия шириной 1 пиксель по левому краю.(При использовании полноэкранной кнопки по умолчанию в окне OpenCV она увеличивается примерно до 5 пикселей в ширину.) Также просто для пояснения, функция tostring (), по-видимому, преобразует данные в необработанные байты, а не в строку?При проверке Python сказал, что новая переменная была байтами.

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

import cv2
import numpy as np

vid = cv2.VideoCapture(0)

while True:
    empty, frame = vid.read()

    frameString = frame.tostring()

    # Intermediary socket stuffs.

    newFrame = np.frombuffer(frameString)

    cv2.imshow("s", newFrame)

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

vid.release()

Учитывая, что все это работает через Numpy, я ожидал бы получить равные результаты на любом конце преобразования, но что-то идетнеправильно, и я даже не уверен, с чего начать. (Стандартные и полноэкранные скриншоты: https://imgur.com/a/BIPxr50)

1 Ответ

0 голосов
/ 06 мая 2019

Вы можете использовать cv2.imencode() для кодирования кадра, а затем превратить его в строку. Оттуда вы можете отправить его через свой сокет. На приемном конце вы можете декодировать его, используя np.fromString() и cv2.imdecode().

import cv2
import numpy as np

vid = cv2.VideoCapture(0)

while True:
    if vid.isOpened():
        empty, frame = vid.read()
        data = cv2.imencode('.jpg', frame)[1].tostring()

        # Intermediary socket stuffs

        nparr = np.fromstring(data, np.uint8)
        newFrame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
        cv2.imshow("s", newFrame)

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

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