我在C ++中使用OpenCV在图像上创建一个多维垫(用作累加器)。
我像这样创建了3d累加器:
const int accumSize[] = {sx, sy, sr};
cv::Mat accum(3, accumSize, CV_64F, cv::Scalar::all(0));
我需要从此累加器中提取n*n*n
投资回报率,以便我可以使用cv::minMaxIdx
在每个投资回报率中获得最大值。
由于这是3d,因此使用cv::Rect
获取ROI的常用方法不起作用。也不是:
accum(cv::Range(x1,x2), cv::Range(y1,y2), cv::Range(r1,r2));
任何人都知道如何轻松获取3d子矩阵而无需显式分配并逐个元素复制?
答案 0 :(得分: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)
答案 1 :(得分:-1)
我们假设您正在使用n
个频道,每个频道都有一个a x b
的矩阵。合并这些渠道以创建Mat
depth = n
和size = a x b
的新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());
。使用Rect来定义和裁剪ROI。
{{1}}