Я работаю над приложением 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, поэтому будьте добры, пожалуйста ^^)