OpenCV中多维cv::Mat的多维ROI的回报率

4

我将使用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子矩阵而无需显式分配并逐个复制元素吗?

2个回答

2
您可以使用()运算符,但是需要提供一个范围的数组,像这样:
cv::Range ranges[3];
ranges[0] = cv::Range(x1, x2);
ranges[1] = cv::Range(y1, y2);
ranges[2] = cv::Range(z1, z2);

accum(ranges)

2
请注意,使用范围似乎是不同的顺序。如果我的矩形是 Rect(x,y,w,h),那么前两个维度的范围必须按顺序排列:{Range(y, y+h), Range(x, x+w), ...} - ferrouswheel

-1
假设您正在处理 n 个通道,每个通道都有一个 a x b 的矩阵。合并这些通道以创建一个新的 Mat,其深度为 n,大小为 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数据类型的一个元素中,否则此方法不起作用。 - ferrouswheel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接