OpenCV中Multidimesional cv::Mat的多维ROI
Posted
技术标签:
【中文标题】OpenCV中Multidimesional cv::Mat的多维ROI【英文标题】:Multidimensional ROI of Multidimesional cv::Mat in OpenCV 【发布时间】: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 子矩阵,而无需显式分配并逐个元素地复制它吗?
【问题讨论】:
【参考方案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 = n
和 size = 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 数据类型的一个元素中,否则这不起作用。以上是关于OpenCV中Multidimesional cv::Mat的多维ROI的主要内容,如果未能解决你的问题,请参考以下文章
CV_HAAR_SCALE_IMAGE 未在 Windows 上的 OpenCv4 中定义