【发布时间】:2017-04-05 18:37:23
【问题描述】:
我有一个 Mat2d 矩阵,其中每个元素都是一个二维向量。例如:
[[x0, y0], [x1, y1]
[x2, y2], [x3, y3]]
我想将这些向量中的每一个乘以一个 Mat1d 相机矩阵:
[fx, 0, cx,
0, fy, cy,
0, 0, 1]
(每个向量代表一个顶点在网格中的位置,我想将其从相机空间转换为像素空间。)
在本例中,生成的矩阵将是:
[[x0 * fx + cx, y0 * fy + cy], [x1 * fx + cx, y1 * fy + cy]
[x2 * fx + cx, y2 * fy + cy], [x3 * fx + cx, y3 * fy + cy]]
实现此目的最直接、最有效的方法是什么?
这是我目前的做法:
Mat2d points = getMesh();
Mat1d cameraMtrx = getCameraMtrx();
for(int col = 0; col < points.cols; col++){
for(int row = 0; row < points.rows; row++){
points.at<Vec2d>(row, col).val[0] = points.at<Vec2d>(row, col)[0] * cameraMtrx.at<double>(0, 0) + cameraMtrx.at<double>(0, 2);
points.at<Vec2d>(row, col).val[1] = points.at<Vec2d>(row, col)[1] * cameraMtrx.at<double>(1, 1) + cameraMtrx.at<double>(1, 2);
}
}
【问题讨论】:
-
应该是最快的方法,你可以从垫子中提取(引入 cariables)fx fy cx 和 cy 并减少函数调用。你可以使用行指针来表示点,这比 .at 函数更有效
-
不,您正在迭代外部循环中的 cols 和内部循环中的行。反过来做会更有效率! (行大订单!!)