2011-09-04 29 views
5

Sử dụng API mới cho OpenCV 2.3, tôi gặp khó khăn khi gán giá trị cho mảng Mat (hoặc nói hình ảnh) bên trong vòng lặp. Đây là đoạn mã mà tôi đang sử dụng;Vấn đề gán giá trị cho mảng Mat trong OpenCV 2.3 - có vẻ đơn giản

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

Bây giờ trong vòng đầu tiên ngay sau j = 133, tôi nhận được ngoại lệ có vẻ liên quan đến độ sâu của hình ảnh, tôi không thể hiểu được tôi đang làm gì sai ở đây.

Vui lòng tư vấn! Cảm ơn! Error is here

Trả lời

7

Bạn đang truy cập vào các dữ liệu như vector đôi 2 thành phần (sử dụng .at<cv::Vec2d>()), nhưng bạn đã tạo các ma trận để chỉ chứa 1 đôi thành phần (sử dụng CV_64FC1). Tạo ma trận để chứa hai thành phần cho mỗi phần tử (với CV_64FC2) hoặc, điều gì có vẻ phù hợp hơn với mã của bạn, hãy truy cập các giá trị dưới dạng tăng gấp đôi đơn giản, sử dụng .at<double>(). Điều này phát nổ chính xác ở j = 133 vì đó là một nửa kích thước của hình ảnh của bạn và khi được xử lý như chứa các vectơ 2 thành phần khi nó chỉ chứa 1, nó chỉ bằng một nửa. Hoặc có thể bạn có thể kết hợp hai ma trận này thành một, chứa hai thành phần cho mỗi phần tử, nhưng điều này phụ thuộc vào cách bạn sẽ sử dụng các ma trận này trong tương lai. Trong trường hợp này bạn cũng có thể hợp nhất hai vòng với nhau và thực sự thiết lập một vector 2 thành phần:

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

Điều này có thể tạo ra một bộ nhớ tốt hơn truy cập vào chương trình nếu bạn lúc nào cũng cần cả hai giá trị, là từ fx và một từ fy, cho cùng một yếu tố.

+0

Đó là nó, cảm ơn! –

Các vấn đề liên quan