最近在学习OpenCV2的RANSC算法,其中比率测试函数代码如下:
int RobustMatcher::ratioTest(std::vector<std::vector<cv::DMatch> > &matches) { int removed = 0; // for all matches for (std::vector<std::vector<cv::DMatch> >::iterator matchIterator = matches.begin(); matchIterator != matches.end(); ++matchIterator) { // if 2 NN has been identified if (matchIterator->size() > 1) { // check distance ratio if ((*matchIterator)[0].distance / (*matchIterator)[1].distance > ratio) { matchIterator->clear(); // remove match removed++; } } else { // does not have 2 neighbours matchIterator->clear(); // remove match removed++; } } return removed;//返回被删除的点数量 }
上述代码有两点不清楚:
1,std::vector<std::vector<cv::DMatch> >。这里出现了一个容器类型的容器,到底是什么意思?直接不懂了
2,用上述容器类型的容器的iterator类型定义了一个迭代器matchIterator,为什么它还有size()和clear()等操作,莫非它是一个容器吗?
请高手们指点一下,谢谢。
解决方案:30分
就是数组的数组,相当于二维数组的功能,有啥绕不过来的吗
迭代器概念上就相当于指针,int 数组的迭代器就是 int*, 数组的数组的迭代器就是 数组的指针, matchIterator 的 size 和 clear 都是调用的它指向的数组的方法,不是迭代器本身的。
迭代器概念上就相当于指针,int 数组的迭代器就是 int*, 数组的数组的迭代器就是 数组的指针, matchIterator 的 size 和 clear 都是调用的它指向的数组的方法,不是迭代器本身的。
解决方案:20分
这样解释:
typename std::vector<int> CIntArr; std::vector<CIntArr> vec; // 你就把CIntArr看成一个 int arr[n];就是一个新的数据结构 std::vector<CIntArr>::iterator iter; // 这里就是 CIntArr*; CIntArr* pArr = iter; CIntArr& arr = *iter; arr.push_back(0); // 即 CIntArr中加入一个元素 arr.push_back(1); int n = arr[0];