2011-08-02 21 views
8

Estoy trabajando con Kinect y OpenCV. Ya busco en este foro pero no encontré nada como mi problema. guardo los datos de profundidad primas de Kinect (16 bits), lo guarde en un CvMat * y luego lo paso a la cvGetImage para crear un IplImage * de él:Convertir profundidad de 8 bits CvMat * a 8 bits de profundidad

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
[...] 
cvGetImage(depthMetersMat,temp); 

Pero ahora tengo que trabajar en esta imagen para hacer cvThreshdold y encontrar contornos. Estas 2 funciones necesitan una imagen de 8 bits de profundidad en la entrada. ¿Cómo puedo convertir CvMat * depthMetersMat en 8-bit-depth-CvMat *?

Respuesta

2

esto debería funcionar:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

Pero according to the OpenCV docs, CvMat es obsoleto. Deberías usar Mat en su lugar.

19

La respuesta que dio @SSteve casi me convenció, pero la llamada al convertTo parecía cortar el byte de alto orden en lugar de escalar los valores a un rango de 8 bits. Dado que @Sirnino no especificó qué comportamiento se quería, pensé en publicar el código que hará la escala (lineal), en caso de que alguien más quiera hacer eso.

código original de SSteve:

CvMat* depthMetersMat = cvCreateMat(480, 640, CV_16UC1); 
cv::Mat m2(depthMetersMat, true); 
m2.convertTo(m2, CV_8U); 

para escalar los valores, sólo tiene que añadir el factor de escala (1/256, o 0.00390625, de 16 bits 8 a escala bits) como el tercer parámetro (alfa) para la llamada a convertTo

m2.convertTo(m2, CV_8U, 0.00390625); 

también puede añadir un cuarto parámetro (delta), que se añadirá a cada valor después de que se multiplica por alfa. Vea el docs para más información.

+2

¿Qué significa "Escalar los valores"? – Maystro

+2

@Maystro, un número de 16 bits sin signo puede tener un valor entre 0 y 65.535, pero necesitamos que los valores entren en un número de 8 bits, que solo puede contener valores de 0 a 255. Por lo tanto, aplicamos un factor de escala , lo que significa que multiplicas cada valor por una constante, en este caso, por 0.00390625. Cualquier número en la matriz original que tenga un valor de 0 a 255 obtiene un nuevo valor de 0, de 256 a 511 se convierte en 1, de 512 a 767 se convierte en 2, etc. – Gillfish

+1

Entonces es como m2.convertTo (m2/256, CV_8U) ¿derecho? Otra pregunta, ¿qué pasa si no pasamos un parámetro de factor de escala? ¿Cómo se calculará? – Maystro

Cuestiones relacionadas