2011-09-04 8 views
5

Używanie nowego API dla OpenCV 2.3, mam problem z przypisaniem wartości do tablicy Mat (lub powiedz obraz) wewnątrz pętli. Oto fragment kodu, którego używam;Problem przydziału wartości do macierzy Mat w OpenCV 2.3 - wydaje się prosty

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

Teraz w pierwszej pętli, jak tylko j = 133, otrzymuję wyjątek, który wydaje się być związane z głębi obrazu, nie mogę dowiedzieć się, co robię źle tutaj.

Proszę doradzić! Dzięki! Error is here

Odpowiedz

7

uzyskiwania dostępu do danych w postaci 2-komponentowego podwójnego wektora (z użyciem .at<cv::Vec2d>()), ale stworzyła matryce zawierają tylko 1 podwójne komponentów (za pomocą CV_64FC1). Utwórz macierze, aby zawierały dwa komponenty na element (z CV_64FC2) lub, co wydaje się bardziej odpowiednie dla twojego kodu, uzyskaj wartości jako zwykłe duble, używając .at<double>(). To eksploduje dokładnie na j = 133, ponieważ jest to połowa wielkości twojego obrazu i gdy traktowane są jako zawierające 2-komponentowe wektory, gdy zawiera tylko 1, jest tylko o połowę szersza.

A może możesz połączyć te dwie macierze w jedną, zawierającą dwa komponenty na element, ale zależy to od sposobu, w jaki zamierzasz używać tych macierzy w przyszłości. W tym przypadku można również połączyć dwie pętle razem i naprawdę ustawić wektor 2-komponent:

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

To może dawać lepszą pamięć z dostępem do systemu, jeśli zawsze trzeba obie wartości, a ten z fx i jedną z dla tego samego elementu.

+0

To wszystko, dzięki! –