2011-09-04 6 views
5

Usando la nueva API para OpenCV 2.3, estoy teniendo problemas para asignar valores a una matriz Mat (o decir imagen) dentro de un ciclo. Aquí está el fragmento de código que estoy usando;Problema al asignar valores a la matriz Mat en OpenCV 2.3 - parece simple

int paddedHeight = 256 + 2*padSize; 
    int paddedWidth = 256 + 2*padSize; 

    int n = 266; // padded height or width 

    cv::Mat fx = cv::Mat(paddedHeight,paddedWidth,CV_64FC1); 
    cv::Mat fy = cv::Mat(paddedHeight,paddedWidth,CV_64FC1);   
    float value = -n/2.0f; 

    for(int i=0;i<n;i++) 
    { 
     for(int j=0;j<n;j++) 
      fx.at<cv::Vec2d>(i,j) = value++;      

     value = -n/2.0f; 
    } 

    meshElement = -n/2.0f; 

    for(int i=0;i<n;i++) 
    { 
     for(int j=0;j<n;j++) 
      fy.at<cv::Vec2d>(i,j) = value; 
     value++; 
    } 

Ahora, en el primer bucle, tan pronto como j = 133, me sale una excepción que parece estar relacionado con la profundidad de la imagen, no puedo entender lo que estoy haciendo mal aquí.

Por favor, avise! ¡Gracias! Error is here

Respuesta

7

se accede a la información como 2-doble componente del vector (usando .at<cv::Vec2d>()), pero se crearon las matrices para contener sólo 1 dobles componentes (usando CV_64FC1). Cree las matrices para que contengan dos componentes por elemento (con CV_64FC2) o, lo que parece más apropiado para su código, acceda a los valores como dobles simples, usando .at<double>(). Esto explota exactamente en j = 133 porque eso es la mitad del tamaño de su imagen y cuando se trata como que contiene vectores de 2 componentes cuando solo contiene 1, es solo la mitad de ancho.

O tal vez puede combinar estas dos matrices en una sola, que contiene dos componentes por elemento, pero esto depende de la forma en que va a utilizar estas matrices en el futuro. En este caso también se puede combinar los dos bucles juntos y realmente establecer un vector de 2 componentes:

cv::Mat f = cv::Mat(paddedHeight,paddedWidth,CV_64FC2); 
float yValue = -n/2.0f; 

for(int i=0;i<n;i++) 
{ 
    float xValue = -n/2.0f; 

    for(int j=0;j<n;j++) 
    { 
     f.at<cv::Vec2d>(i,j)[0] = xValue++; 
     f.at<cv::Vec2d>(i,j)[1] = yValue; 
    } 

    ++yValue; 
} 

Esto podría producir un mejor acceso a memoria esquema si siempre necesita ambos valores, el de FX y el de fy, por el mismo elemento.

+0

¡Eso fue todo, gracias! –

Cuestiones relacionadas