2012-01-10 18 views

Trả lời

8

Dưới đây là ví dụ ngắn từ tài liệu NAryMatIterator; nó cho thấy làm thế nào để tạo, cư, và xử lý một ma trận đa chiều trong OpenCV:

void computeNormalizedColorHist(const Mat& image, Mat& hist, int N, double minProb) 
{ 
    const int histSize[] = {N, N, N}; 

    // make sure that the histogram has a proper size and type 
    hist.create(3, histSize, CV_32F); 

    // and clear it 
    hist = Scalar(0); 

    // the loop below assumes that the image 
    // is a 8-bit 3-channel. check it. 
    CV_Assert(image.type() == CV_8UC3); 
    MatConstIterator_<Vec3b> it = image.begin<Vec3b>(), 
          it_end = image.end<Vec3b>(); 
    for(; it != it_end; ++it) 
    { 
     const Vec3b& pix = *it; 
     hist.at<float>(pix[0]*N/256, pix[1]*N/256, pix[2]*N/256) += 1.f; 
    } 

    minProb *= image.rows*image.cols; 
    Mat plane; 
    NAryMatIterator it(&hist, &plane, 1); 
    double s = 0; 
    // iterate through the matrix. on each iteration 
    // it.planes[*] (of type Mat) will be set to the current plane. 
    for(int p = 0; p < it.nplanes; p++, ++it) 
    { 
     threshold(it.planes[0], it.planes[0], minProb, 0, THRESH_TOZERO); 
     s += sum(it.planes[0])[0]; 
    } 

    s = 1./s; 
    it = NAryMatIterator(&hist, &plane, 1); 
    for(int p = 0; p < it.nplanes; p++, ++it) 
     it.planes[0] *= s; 
} 

Ngoài ra, hãy kiểm tra cv::compareHist chức năng cho một ví dụ sử dụng các NAryMatIteratorhere.

+0

vì vậy, một mảng 3 chiều nên là một cái gì đó như thế này phải không? int sz [] = {3, 3, 3}; Mat tích lũy (3, sz, CV_8U, Scalar :: tất cả (0)); accumarray.at (0, 1, 2) = 20; – garak

+0

Có. Điều đó sẽ làm việc tốt. – mevatron

+0

Vâng, có vẻ như phương pháp trên không hoạt động cho Ma trận 4 chiều. Bạn có biết lý do không? – garak

1

Để tạo ra một ma trận đa chiều đó là kích thước 100x100x3, sử dụng phao, một kênh, và với tất cả các yếu tố khởi tạo đến 10 bạn viết như thế này:

int size[3] = { 100, 100, 3 }; 
cv::Mat M(3, size, CV_32FC1, cv::Scalar(10)); 

Để lặp qua và sản lượng các yếu tố trong ma trận bạn có thể làm:

for (int i = 0; i < 100; i++) 
    for (int j = 0; j < 100; j++) 
    for (int k = 0; k < 3; k++) 
     std::cout << M.at<cv::Vec3f>(i,j)[k] << ", "; 

Tuy nhiên, hãy cẩn thận của những rắc rối với việc sử dụng ma trận đa chiều như tài liệu ở đây: How do i get the size of a multi-dimensional cv::Mat? (Mat, or MatND)

+0

Chính xác những gì tôi đang tìm kiếm, đơn giản và tiện lợi! Cảm ơn. –

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