2011-09-04 7 views
5

Utilizzando la nuova API per OpenCV 2.3, sto riscontrando problemi nell'assegnazione di valori a un array Mat (o all'immagine) all'interno di un ciclo. Ecco lo snippet di codice che sto usando;Problema nell'assegnazione dei valori all'array Mat in OpenCV 2.3 - sembra semplice

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++; 
    } 

Ora, nel primo giro non appena j = 133, ottengo un'eccezione che sembra essere correlato alla profondità dell'immagine, non posso capire che cosa sto facendo male qui.

Si prega di avvisare! Grazie! Error is here

risposta

7

si accede ai dati da 2 componenti doppio vettore (usando .at<cv::Vec2d>()), ma è stato creato il matrici per contenere solo 1 doppie componente (usando CV_64FC1). O creare le matrici per contenere due componenti per elemento (con CV_64FC2) o, ciò che sembra più appropriato per il codice, accedere ai valori come semplici doppi, utilizzando .at<double>(). Questo esplode esattamente a j = 133 perché è metà della dimensione dell'immagine e quando viene trattato come contenente vettori a 2 componenti quando contiene solo 1, è solo la metà di larghezza.

O forse è possibile unire queste due matrici in una, contenente due componenti per elemento, ma questo dipende dal modo in cui si useranno queste matrici in futuro. In questo caso è anche possibile unire i due anelli insieme e davvero impostare un vettore a 2 componenti:

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; 
} 

Questo potrebbe produrre una memoria migliore accesso schema se è sempre necessario entrambi i valori, quello da fx e quello di fy, per lo stesso elemento.

+0

E 'stato così, grazie! –