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 = 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 数据类型的一个元素中,否则这不起作用。

以上是关于OpenCV中Multidimesional cv::Mat的多维ROI的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3.0中IplImage* 转cv::Mat

关于opencv中cv::Mat设置roi

CV_HAAR_SCALE_IMAGE 未在 Windows 上的 OpenCv4 中定义

在 OpenCv 中使用“cv::imread”函数读取图像的问题

Python+OpenCV:cv2.imwrite

OpenCV-中cv2.threshold详解