【问题标题】:Multidimensional ROI of Multidimesional cv::Mat in OpenCVOpenCV中Multidimesional cv::Mat的多维ROI
【发布时间】:2014-08-06 18:47:04
【问题描述】:

我在 C++ 中使用 OpenCV 在图像上创建多维垫(用作累加器)。

我这样创建 3d 累加器:

const int accumSize[] = {sx, sy, sr};
cv::Mat accum(3, accumSize, CV_64F, cv::Scalar::all(0));

我需要从这个累加器中提取一个n*n*n ROI,这样我就可以使用cv::minMaxIdx 获得每个ROI 中的最大值。

由于这是 3d,因此使用 cv::Rect 获取 ROI 的常用方法不起作用。也没有:

accum(cv::Range(x1,x2), cv::Range(y1,y2), cv::Range(r1,r2));

有人知道如何轻松获得 3d 子矩阵,而无需显式分配并逐个元素地复制它吗?

【问题讨论】:

    标签: c++ opencv multidimensional-array roi


    【解决方案1】:

    您可以使用() 运算符,但是您需要提供一个范围数组,如下所示:

    cv::Range ranges[3];
    ranges[0] = cv::Range(x1, x2);
    ranges[1] = cv::Range(y1, y2);
    ranges[2] = cv::Range(z1, z2);
    
    accum(ranges)
    

    【讨论】:

    • 请注意,使用范围似乎是不同的顺序。如果我的 Rect 是 Rect(x,y,w,h),那么前两个维度的范围必须是:{Range(y, y+h), Range(x, x+w), ...}
    【解决方案2】:

    假设您正在使用n 频道,每个频道都有一个a x b 矩阵。合并这些频道以创建一个新的 Mat depth = nsize = a x b。使用 Rect 定义和裁剪 ROI。

    vector<Mat> channels;
    
    // populate this vector with number of channels you desire
    
    Mat mergedChannels, croppedChannels;
    Rect roi(x1, y1, x2-x1, y2-y1);
    
    merge(channels, mergedChannels);
    croppedChannels = mergedChannels(roi);
    
    printf("%d %d %d\n", croppedChannels.cols, croppedChannels.rows, croppedChannels.channels());
    

    【讨论】:

    • 除非通道都包含在 cv::Mat 数据类型的一个元素中,否则这不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多