Multi-Dimensional data in a Matrix in OpenCV with C++

前端 未结 2 830
一向
一向 2020-12-05 16:52

I want to declare, populate, access a Multi-Dimensional Matrix in OpenCV (C++) which is compatible with namespace cv. I found no quick and easy to learn exa

2条回答
  •  日久生厌
    2020-12-05 17:24

    Here is a short example from the NAryMatIterator documentation; it shows how to create, populate, and process a multi-dimensional matrix in 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_ it = image.begin(),
                                 it_end = image.end();
        for( ; it != it_end; ++it )
        {
            const Vec3b& pix = *it;
            hist.at(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;
    }
    

    Also, check out the cv::compareHist function for another usage example of the NAryMatIterator here.

提交回复
热议问题