如何在OpenCV函数中访问多维矩阵的子矩阵
How to access a sub-matrix of a multi-dimensional matrix in OpenCV function?
我有一个大小为100x100x100的多维矩阵a,我想得到a的子矩阵,例如A[10:20, 20:30, 30:40]
。当原始矩阵有二维时,OpenCV有一个Mat算子来访问子矩阵,例如:A(Range(10,20), Range(20,30))
对于一个多维矩阵,是否有有效的方法来完成这个访问?我问这个问题是因为我需要将子矩阵复制到另一个地方。
答案1
如果mat A是3D 100行x 100色x 100平面x n通道,你可以使用mat mat::operator()(const Range* ranges) const::
std::vector<Range> ranges;
ranges.push_back(Range(10,20));
ranges.push_back(Range(20,30));
ranges.push_back(Range(30,40));
Mat B = A(&ranges[0]);
B将是10x10x10xn通道
回答2
如果垫A是100行x 100色x 100通道,那就是100通道的2D垫。你可以这样做:
Mat B = A(Range(10,20), Range(20,30)); // B will be 10x10x100
现在你需要从B中选择通道30:40,你需要使用void mixChannels(const Mat* src, size_t nsrc, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs):
Mat C(10, 10, CV_MAKETYPE(A.depth(), 10));
int from_to[] = { 10,0, 11,1, 12,2, 13,3, 14,4,
15,5, 16,6, 17,7, 18,8, 19,9};
mixChannels(&B, 1, &C, 1, fromTo, 10);
然后,C将根据需要为10行x 10色x 10通道。这有点乱,但我不知道有更好的方法
相关文章:
- C++中的openCV Mat访问冲突
- OpenCV C++:当垫子类型未知时无法访问垫子元素?
- OpenCV C++ 3 维垫数据访问错误值
- OpenCV Tracker 属性访问在 ARM 上因 SEGFAULT 而失败,但在 X86_64 中工作
- 访问OpenCV GpuMat频道
- 访问 openCV 中某个图像中所有像素的 RGB 值
- 以numpy/Python的风格访问OpenCV和C++中的矩阵元素
- 如何访问OpenCV中UDEV与UDEV相关的网络摄像头
- 如何访问OpenCV匹配器上的点位置
- 访问 opencv 矩阵CV_32S元素
- 为什么我无法访问 openCV 中的矩阵元素?
- 访问OpenCV中的Mat二进制图像元素
- 尝试访问 OpenCV 中的像素值时出错
- 快速像素访问 opencv
- 访问OpenCV中灰度图像的像素值
- cvCreateCameraCapture无法访问OpenCV 3.0相机
- 访问OpenCV中每个单独的通道
- 访问OpenCV Mat中的多个通道
- 访问OpenCV中矩阵中的值
- 访问OpenCV Mat CV_16UC1的元素