Кодирование изображения opencv в Base64 не дает правильное изображение - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь отправить изображение с камеры Pi на веб-сервер колбы.Когда я кодирую изображение Base64, кажется, что оно не дает правильного изображения.

Я могу сделать снимок и обработать его через opencv.Изображение в кодировке Base64 передается на веб-страницу, но отправленная строка не является допустимым изображением.Чтобы доказать это, я сохранил изображение и обработал его с помощью онлайн-конвертера Base64.Вставка этой строки в веб-страницу показывает изображение.

def Take_Picture(camera):
    stream = io.BytesIO()                                           # saving the picture to an in-program stream 
    camera.resolution = (160,120)                                   # set resolution
    camera.capture(stream, format='jpeg', use_video_port=True)      # capture into stream
    mydata = np.fromstring(stream.getvalue(), dtype=np.uint8)       # convert image into numpy array
    img = cv2.imdecode(mydata, -1)                                  # to opencv image
    data = base64.b64encode(img).decode('utf-8')
    print(data)
    cv2.imwrite("test.jpg",img)
    return data

HTML

<img src="data:image/jpeg;charset=utf-8;base64,{{img}}"  alt="Camera View" width="640" height="480">

Я получаю результат

b'AAIAAAIAAAIAAAIAAAIAAAAAAAIAAAIAAAIAAAIAAAIAAAMAAAIAAAIAAA ...

1014 из *

1014 извыше.Но я получаю

/ 9j / 4AAQSkZJRgABAQAAAQABAAD / 2wBDAAIBAQEBAQIBAQECAgICAgQDAGICAgUEBAMEBgUG ...

от test.jpg преобразования онлайн-Base64.Помещение этой строки в веб-страницу отображает изображение.

1 Ответ

0 голосов
/ 04 января 2019

Вы должны преобразовать ваше изображение обратно из массива в изображение, которое затем можно правильно закодировать в Base64!То, что вы сейчас делаете, это то, что вы кодируете пустой массив в строку base64, что, безусловно, не может дать тот же результат, что и онлайн-инструмент base64!

Что вам нужно сделать, передать массив numpy в cv2.imencode, который возвращает объект изображения буфера, а затем вы можете преобразовать его в base64

retval, buffer_img= cv2.imencode('.jpg', img)
data = base64.b64encode(buffer_img)

ИЛИ Вы можете пропустить img = cv2.imdecode(mydata, -1) и передать mydata непосредственно на base64.b64encode(mydata), пока изображение уже сохранено в памяти!

Нет изображения openCV, изображение openCV является массивом ndArray.Когда вы выполните print(type(img)), вы получите <class 'numpy.ndarray'>

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