2012-10-08 33 views
8

si tengo una matriz de tipo CV_32SC1, que tipo nombre shuld utilizo en la función Mat :: at?Acceso matriz opencv CV_32S elemento

p. Ej.

Mat X; // for example eye matrix of size 10,10,and type CV_32SC1 
X.at<??????>(1,1)=5; 
  • ¿Cómo puedo encontrar el nombre de tipo para otros tipos de matriz?

Respuesta

15

La regla general para typenames matrices en OpenCV es:

CV_<bit_depth>(S|U|F)C<number_of_channels> 

S = Signed integer 
U = Unsigned integer 
F = Float 

Así que dependiendo de cuál de las cartas anteriores (S, U, F) que tiene, se le CASTING <int>, <unsigned integer> o <float>.

+0

Por favor, realmente [lea] (http://stackoverflow.com/review-beta/suggested-edits/780994) las revisiones que está haciendo clic aprueban. –

+1

En este caso preferiría a , ya que el estándar de C++ no especifica el tamaño de bit de los tipos integrales. –

+0

No hay ningún tipo de CV_32U *. Sin embargo, puede usar 'X.at (i, j)' si su matriz CV_32SC1 realmente contiene valores sin firmar. – greggo

3

CV_32SC1 es un 1 canal de entero de 32 bits con signo, entonces creo que X.at<int>() debería hacer.

Mat ya 'sabe' cómo direccionar un píxel, el tipo acaba de convertir los bits al valor de C++ que necesita para la evaluación de la expresión.

Encontré here alguna explicación sobre la notación.

+0

No del todo cierto. con 'at ', el direccionamiento en la dirección x se basa completamente en el tamaño de T. Si su matriz es CV_8UC3, entonces 'X. en (0,2)' obtendrá el tercer píxel en la primera fila; pero 'X.at (0,2 * 3 + 1)' le dará el segundo canal del mismo píxel (es decir, el mismo byte que 'X.at (0,2) [1]' Debido a esto , el tono en dirección x se basa en una constante de tiempo de compilación 'sizeof (T)' en lugar de en un valor calculado a partir del tipo almacenado en el objeto Mat, lo que hace una diferencia considerable en el rendimiento. También admite la vista 'plana' de arios multicanal – greggo