2017-08-24 1 views
0

Je sauvegarde un OpenCV Mat binaire dans un fichier HDF5.
Dans les fichiers OpenCV Mat sont stockés dans la mémoire avec le premier canal d'index, deuxième indice est coordonnée x et troisième indice est coordonnée Y, donc un accès d'adresse ressemble à:
Les données de tableau sont traversées de manière incorrecte Python/Matlab

address = M.data + M.step[0]*y + M.step[1]*x + ch 

Où M.step [0 ] = NUM_X * NUM_CH et M.step [1] = MAX_CH

Le problème que je rencontre est que Matlab et Python interprètent les données de manière incorrecte.
Bien que les dimensions des données lues soient réglées correctement (canal, x, y), quand je regarde dans le stockage de données, je vois, que par exemple. numpy lit les données en arrière, ce qui signifie que y est incrémenté, puis x et enfin le numéro de canal, ce qui signifie qu'il assume une configuration planaire des données de canal, alors qu'il est réellement entrelacé. Cela entraîne une mauvaise visualisation des images.
Existe-t-il un moyen de dire à numpy/Matlab de changer l'accès aux données, sans réordonner les données?
Merci d'avance.

Edit:
je stocke tout dans un ensemble de données de rang 3 dans le fichier hdf5, où la dimension est une chaîne, dimension 2 est coordonnée x et la dimension 3 est coordonnée y.
Si je lis cet ensemble de données et le traite avec OpenCV en C++, l'image correcte est affichée. OpenCV dans python ne fonctionne pas à cause d'erreur: (-206) Type de tableau non reconnu ou non pris en charge cvGetMat

+0

Comment allez-vous le lire en Python? Vous pouvez créer un dtype numpy personnalisé à lire. L'un des meetups auxquels je vais récemment a eu un entretien sur l'utilisation de types de données numpy personnalisés pour lire des données arbitraires, vous pouvez le consulter [ici] (https://github.com/desertpy/presentations/blob/master/numpy-datatypes -godber/Numpy_Dtypes.ipynb). Peut-être que cela sera utile. –

Répondre

0

Je pourrais résoudre la question en python en changeant la forme et la foulée du tableau, qui avait été calculé dans un mauvais sens:
Si j'avais un 3 * 1280 * 720 uint8 Image avec 3 étant numéro de canal, 1280 étant x-coordonnée et 720 étant y-coordonnée, je devrais attribuer la forme, de sorte qu'il ressemble à data.shape = (720, 1280, 3) et la foulée devrait être changée en data.strides = (3 * 1280,3,1).

Ce lien explique comment les tableaux numpy fonctionnent en mémoire:
Numpy doc