// Listing 4.1. Sumowanie elementów tablicy wielowymiarowej płaszczyzna po płaszczyźnie
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;

// Sumowanie elementów tablicy wielowymiarowej płaszczyzna po płaszczyźnie
//
int main( int argc, char** argv ) {
  
  cout << "\nListing 4.1. Sumowanie elementów tablicy wielowymiarowej płaszczyzna po płaszczyźnie"
       << "\nWywołanie:\n"
       << argv[0] << endl;

  const int n_mat_size = 5;
  const int n_mat_sz[] = { n_mat_size, n_mat_size, n_mat_size };
  cv::Mat n_mat( 3, n_mat_sz, CV_32FC1 );

  cv::RNG rng;
  rng.fill( n_mat, cv::RNG::UNIFORM, 0.f, 1.f );

  const cv::Mat* arrays[] = { &n_mat, 0 };
  cv::Mat my_planes[1];
  cv::NAryMatIterator it( arrays, my_planes );

  // w każdej iteracji it.planes[i] będzie bieżącą
  // płaszczyzną i-tej tablicy z arrays
  //
  float s = 0.f; // suma wszystkich płaszczyzn
  int   n = 0;   // liczba wszystkich płaszczyzn
  for (int p = 0; p < it.nplanes; p++, ++it) {
    s += cv::sum(it.planes[0])[0];
    n++;
  }

  cout <<"Suma całości: " <<s <<endl;

}
