Как увидеть продолжающийся поток данных 8-битного изображения в оттенках серого с USB-порта?

#python #opencv #image-processing

#python #opencv #обработка изображений

Вопрос:

Итак, у меня есть непрерывный поток данных, поступающий через порт COM4 в Windows. Я считываю данные с помощью этого кода:

 import serial
import cv2
from time import sleep

ser = serial.Serial ("COM4", 115200)    
while True:
    received_data = ser.read()              
    sleep(0.03)
    data_left = ser.inWaiting()             
    a=cv2.imread(received_data,0)
    cv2.imshow("Image",a)
    print (received_data)
 

часть OpenCV не работает, и spyder выдает эту ошибку:

 TypeError: bad argument type for built-in operation
 

Если я выну часть OpenCV, я смогу увидеть такие байты:

 b'AAx00A::x00A:Ax00AA:x00A:Ax00A:Ax00:A:x00A:AAA::AAAx00AAAx00A::x00:AAx00:::x00AAAx00x00x00x00x00x00x00x00x00x00x00x00x00::Ax00A::A::::A::A:Ax00AAAx00A::x00AA:x00:A:x00::Ax00AAAx00A:Ax00:A:x00:A:x00::AAA::::A:A::x00AA:x00:::x00AAAx00::Ax00:AAx00:AAx00::Ax00:::x00:A:x00A::AAAA:A:AAA:x00A::x00:AAx00AAAx00:::x00:A:x00AAAx00AAAx00x00x00x00x00x00x00x00x00x00x00x00x00x00::AA:x00A::x00:A:x00:::x00:::x00AAAx00:::x00:A:x00:A:x00A:3x00AAAAA:A:::AA::x00::Ax00A::x00A:Ax00:::x00:::x00::Ax00:::x00A::x00:AAx00AA:AA::AAAA:::x00::Ax00AA:x00A::x00:A:x00:AAx00A::x00AA:x00AA:x00:AAx00:A:x00x00x00x00x00x00x00x00x00x00x00x00x00x00Ax00:::x00AA:x00:AAx00:A:x00AAAx00:::x00A::x00A::x00AAAA:AAA:Ax00:AAx00A::x00:AAx00:::x00:A:x00A:A'
 

Эти данные представляют собой 8-битные данные изображения в оттенках серого. Как я могу видеть непрерывный поток данных (вроде видео в оттенках серого) с помощью python?

Это необработанные 8-битные данные изображения в оттенках серого, поступающие с FPGA. Размеры 160 * 120, начальный бит равен 0, а конечный бит равен 1

Комментарии:

1. Вам нужно будет знать форму (то есть размеры) изображения.

2. Как я могу это понять? Имеет ли это какое-либо отношение к разрешению? Если мы предположим, что я знаю размер, что мне делать?

3. да, вам, вероятно, придется увидеть, где начинается изображение и где оно заканчивается, и вам нужно знать формат, поэтому, например, если это необработанные данные RGB, вам нужно сделать разные тонкие файлы, чем если бы это было изображение в формате jpeg

4. Это 8-битные необработанные данные изображения в оттенках серого с разрешением 160×120. Что это означает как массив numpy?

Ответ №1:

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

 import cv2
import numpy as np

while True:

    bytesBuffer = read and accumulate 160*120 bytes from serial

    # Make bytes buffer into Numpy array and reshape
    frame =  np.frombuffer(bytesBuffer, dtype=np.uint8).reshape((120,160))

    cv2.imshow("Frame", frame)
    cv2.waitKey(30)
 

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

Возможно, вам потребуется поменять местами 120 и 160. Как бы то ни было, предполагается, что высота составляет 120 пикселей, а ширина — 160 пикселей.

Проблема с вашим кодом заключается в том, что cv2.imread() ожидается файл, содержащий изображение в формате JPEG / PNG, а не необработанные байты, которые вы в данный момент ему предоставляете.

Вы могли бы с пользой использовать буфер из 160×120 байт данных в вашем вопросе или предоставить некоторый последовательный код, который отправляет изображение так же, как и ваш источник.

Комментарии:

1. Привет. Спасибо, что ответили на мой вопрос. Я новичок в FPGA, и я использую FPGA, которая подключена к камере, поэтому я не знаю, когда на самом деле начинается изображение. Но FPGA отправляет байты, когда я включаю переключатель, поэтому мне может не понадобиться начальное битовое представление.

2. Итак, я отправляю 0 в качестве начального бита и 1 в качестве остановочного бита

3. Хорошо, мой приведенный выше код должен работать с этим сценарием. Если этого не произойдет, пожалуйста, соберите первые 120 * 160 байт, сохраните их в файле и поделитесь им через Dropbox или Google Drive или что-то подобное, и я придумаю, как отобразить его для вас.

4. Обратите внимание, что если вы предоставляете общий доступ к файлу, он должен быть записан как двоичный и иметь длину ровно 19 200 байт.

5. Я понял, что мое изображение на самом деле имеет разрешение 640 * 480. Итак, я собираюсь отправить вам файл, который имеет 307 200 байт