Как десериализовать образ opencv, отправленный из c ++ в python 3? - PullRequest
4 голосов
/ 17 мая 2019

Я работаю над приложением python3, где мне нужно создать образ openCV из данных, которые были сериализованы приложением C ++ и сохранены в сообщении protobuf. У меня есть доступ только к структуре, которая содержит следующие данные:

message Image {
    uint32          rows            =1;
    uint32          cols            =2;
    int32           elemType        =3; //openCV type (ex: CV_8U)
    int32           elemSize        =4;
    bytes           data            =5;
}

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

Вот некоторый код, где img - это структура, о которой я упоминал ранее:

def DeserializeImage(self, img):
    # We have to parse the OpenCV elem type because we first build a numpy array from serialized data
    numpyType = self.ParseOpenCVType(img.elemType)
    data = np.frombuffer(img.data, dtype=numpyType)
    data = data.reshape(img.rows, img.cols)

    # If we use a float, the range is probably between 0 and 1
    if data.dtype == np.float32:
        data = 255 * data

    cv2.imwrite('color_img.png', data)

    # SHOW FOR TESTS
    cv2.imshow('Color image', data)
    cv2.waitKey(int(1000/23))

def ParseOpenCVType(self, id):
    # Rough parsing of OpenCV elem type, need to be improved
    try:
        openCVType = [name for name in dir(cv2) if name.startswith("CV_") and getattr(cv2, name) == id][0]

        if openCVType.endswith("32F"):
            numpyType = np.float32
        elif openCVType.endswith("8U"):
            numpyType = np.uint8
        else:
            raise TypeError(openCVType)
    except TypeError:
        print('Exception raised: Unknow numpy type !')
        raise

    return numpyType

Я хочу пропустить странный разбор, который здесь делается, но как? Я не знаю... (Я новичок в Python, openCV и stackoverflow, поэтому будьте добры, пожалуйста ^^)

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