有一些方法,以产生以下形式的2D矩阵:生成坐标网格
(0, 0) (1, 0) (2, 0) (3, 0)
(0, 1) (1, 1) (2, 1) (3, 1)
(0, 2) (1, 2) (2, 2) (3, 2)
(0, 3) (1, 3) (2, 3) (3, 3)
在指数表示法,该矩阵可表示为grid[j, i] = (i, j)
。
一个平凡的方式来生成该网格将是:
auto grid = cv::Mat(height, width, CV_32FC2);
for (auto j = 0; j < height; j++) {
for (auto i = 0; i < width; i++) {
grid.at<cv::Vec2f>(j, i) = cv::Point2f(i, j);
}
}
但这是缓慢的,“手动”,有点难看。
在Python中,我们可以做到这一点:
grid = np.dstack(np.meshgrid(np.arange(width), np.arange(height)))
什么是产生在C++中此网格cv::Mat
类型的好办法吗?
为什么需要这样的电网?这些东西通常用在MATLAB或Python中以避免循环。我的C++循环工作得很快,不需要这种格子这种情况。如果你真的需要它,那么你在CPP中展示的方式是可以的。 –
@AndreySmorodov我需要这个网格的原因是对每个点应用仿射变换来查看它的结束位置。粗略地说,'transform.dot(grid.reshape(width * height,2).transpose())'会为我提供一个每个点在变换下最终位置的列表。 –
如果我没有误会,你缺少用于内循环的{}。没有'{}'只有第一个下面的语句会从嵌套循环中执行 –