for (auto it: nm_corners) { fast::fast_xy &xy = fast_corners.at(it); if (xy.x >= grid_n_cols_ * grid_width_ || xy.y >= grid_n_rows_ * grid_height_) continue; const int k = sub2ind(cv::Point2f(xy.x, xy.y)); if (occupancy_grid_[k]) continue; const float score = shiTomasiScore(image, xy.x, xy.y); if (score > score_table[k]) { score_table[k] = static_cast<double>(score); feature_table[k] = cv::Point2f(xy.x, xy.y); } }
时间: 2024-02-14 10:35:42 浏览: 110
这段代码是在遍历经过非极大值抑制后的角点信息 `nm_corners`,对每个角点进行检查,以确定是否将其作为特征点。对于每个角点,首先获取其坐标,然后判断其是否在图像的有效范围内,如果不在则跳过。接着,将角点的坐标转换为网格的索引,然后检查该网格是否已经被占用(即已经存在特征点)。如果网格已经被占用,则跳过该角点。最后,计算该角点的 Shi-Tomasi 分数,并将分数与该网格之前检测到的所有角点的分数进行比较,如果该角点的分数更高,则将其作为特征点存储在 `feature_table` 向量中,并更新该网格的分数表 `score_table`。经过遍历所有角点后,返回最终的特征点坐标列表 `features`。
相关问题
#ifdef __SSE2__ fast::fast_corner_detect_10_sse2( (fast::fast_byte *) image.data, image.cols, image.rows, image.cols, 20, fast_corners); #else fast::fast_corner_detect_10( (fast::fast_byte*) image.data, image.cols, image.rows, image.cols, 20, fast_corners); #endif
这段代码是在调用 fast corner detection 算法来检测图像中的角点。其中,使用了条件编译,如果系统支持 SSE2 指令集,则调用 SSE2 版本的 fast corner detection 算法,否则调用普通版本的算法。函数的输入参数包括图像数据的指针、图像的宽度和高度、图像的步长、阈值以及用于存储检测到的角点信息的向量。
fast::fast_nonmax_3x3(fast_corners, scores, nm_corners);
这行代码是在调用 fast nonmax 3x3 算法对 fast corner detection 算法检测到的角点进行非极大值抑制。该算法基于 3x3 的窗口,将窗口中心点的得分与相邻 8 个点的得分进行比较,若中心点得分最大,则保留该点,否则将其剔除。函数的输入参数包括检测到的角点向量 `fast_corners`、角点得分向量 `scores`,以及用于存储非极大值抑制后的角点信息的向量 `nm_corners`。函数执行完毕后,`nm_corners` 向量中存储的是经过非极大值抑制后的角点信息。
阅读全文