Convertir les 16 bits de profondeur CvMat* 8 bits de profondeur
Je travaille avec Kinect et OpenCV. J'ai déjà chercher dans ce forum, mais je n'ai pas trouver quelque chose comme mon problème.
- Je conserver les premières données de profondeur de Kinect (16 bits), j'ai le stocker dans un CvMat* et puis je le passe à la cvGetImage pour créer un IplImage*:
CvMat* depthMetersMat = cvCreateMat( 480, 640, CV_16UC1 );
[...]
cvGetImage(depthMetersMat,temp);
Mais maintenant, j'ai besoin de travailler sur cette image afin de ne cvThreshdold et de trouver les contours. Ces 2 fonctions ont besoin d'un 8-bits de profondeur de l'image en entrée. Comment puis-je convertir des CvMat* depthMetersMat dans un 8-bits de profondeur de la CvMat* ?
OriginalL'auteur Sirnino | 2011-08-02
Vous devez vous connecter pour publier un commentaire.
La réponse de @SSteve a presque fait le tour pour moi, mais l'appel à la
convertTo
semblait juste couper l'octet de poids fort au lieu de mise à l'échelle les valeurs de 8 bits de large. Depuis @Sirnino n'ai pas spécifié de quel comportement est voulu, je pensais que je poste le code qui va faire l' (linéaire) de mise à l'échelle, au cas où quelqu'un d'autre, c'est vouloir le faire.SSteve le code original:
À l'échelle des valeurs, il vous suffit d'ajouter le facteur d'échelle (1/256, ou 0.00390625, pour 16 bits à 8 bits de mise à l'échelle) en tant que troisième paramètre (alpha) de l'appel à
convertTo
Vous pouvez également ajouter un quatrième paramètre (delta) qui sera ajouté à chaque valeur après il est multiplié par alpha. Voir la docs pour plus d'info.
un entier non signé de 16 bits nombre peut avoir une valeur de n'importe où de 0 à 65 535, mais nous avons besoin de valeurs pour s'adapter à un nombre de 8 bits, qui ne peut contenir des valeurs de 0 à 255. Si l'on applique un facteur d'échelle, ce qui signifie simplement que vous multiplier chaque valeur par une constante, dans ce cas, par 0.00390625. N'importe quel nombre dans la matrice d'origine qui a une valeur de 0 à 255 obtient une nouvelle valeur de 0, 256 à 511 devient 1, 512 à 767 devient 2, etc.
Alors c'est comme un m2.convertTo(m2/256,CV_8U) droit? Une autre question, et si nous n'avions pas passé à un facteur d'échelle de paramètre? comment sera calculé?
Correct. Vous pouvez simplement appliquer le facteur d'échelle de la matrice avant de les passer à la fonction. Si vous n'avez pas l'échelle des valeurs, il apparaît que la
convertTo()
fonction des côtelettes au large de la des bits supplémentaires de la valeur de 16 bits pour le faire rentrer en 8-bits. Vous aurez à vérifier le lien vers les docs que j'référence dans ma réponse pour voir exactement ce qui se passe.Le facteur d'échelle semblent mauvais pour moi. Nous voulons une carte de la gamme de [0 à 65 535] ushort (CV_16U) [0-255] de char (CV_8U). Donc l'équation est de 255=65 535 à/x. Que x se trouve être 257, de sorte que le facteur d'échelle est 1/257, droit?
OriginalL'auteur Gillfish
Cela devrait fonctionner:
Mais selon le OpenCV docs, CvMat est obsolète. Vous devez utiliser des Tapis à la place.
OriginalL'auteur SSteve