如何在 OpenCV 中访问高维矩阵的元素?

Posted

技术标签:

【中文标题】如何在 OpenCV 中访问高维矩阵的元素?【英文标题】:how could I access the element of a high-dimensional matrix in OpenCV? 【发布时间】:2015-05-26 06:39:55 【问题描述】:

我正在尝试在 OpenCV 中使用 4-d 矩阵,初始化部分如下所示:

int feature_points_size[] = bincellDim.x , bincellDim.y , bincellDim.z , 100;
feature_points.create(4 , feature_points_size , CV_64F);

但是库不允许我像这样使用 'at' 访问 feature_points 的元素:

feature_points.at<double>(k , j , i , l) = stickfea_code.at<double>(l , 0);
feature_points.at<double>(k , j , i , l + 50) = countfea_code.at<double>(l , 0);

似乎 Mat.at 没有 4 个输入的版本 访问它的元素的最佳做法是什么?

提前谢谢!

【问题讨论】:

【参考方案1】:

cv::Mat::at&lt;&gt; 确实,实际上有一个 n-dim 重载,您需要使用 T&amp; Mat::at(const int* idx) 版本。 或者,只需为它编写自己的(外部)包装器,您可以像这样使用它:

at4D<double>(feature_points,k,j,i,l);

【讨论】:

【参考方案2】:

只是按照@Adi-Shavit 的回答举例:

std::vector<int> dims = 1, 3, 700, 400;
cv::Mat mat4d = cv::Mat(std::vector<int>, CV_32FC1);
int p[4];
p[0] = 0;
for (unsigned hi=0; hi<dims[3]; hi++) 
    p[3] = hi;
    for (unsigned wi=0; wi<dims[2]; wi++) 
        p[2] = wi;
        for (unsigned ci=0; ci<dims[1]; ci++) 
            p[1] = ci;
            float value = mat4d.at<float>(&p[0]);
            mat4d.at<float>(&p[0]) = some_new_value;
        
    

【讨论】:

以上是关于如何在 OpenCV 中访问高维矩阵的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何像矩阵元素一样访问opencv中的vector<vector<Point>>轮廓?

如何使用 opencv 库将 3D 矩阵的元素归零?

OpenCV:矩阵元素访问

opencv多通道元素访问

OpenCV 中的高效矩阵复制

OpenCV:访问 5D 矩阵的元素