问题 如何将转换矩阵应用于OpenCV中的某个点?


假设我有一个转换矩阵 Mat  tr 我来自 getAffineTransform() 和a Point2d  p。我想要的是翘曲的结果 p 同 tr。 OpenCV是否提供了这样做的方法?


1246
2017-10-29 22:46


起源



答案:


cv::transform 用于转换具有变换矩阵的点。

N通道阵列src的每个元素被解释为N元素向量,其使用M×N或M×(N + 1)矩阵m变换为M元素向量 - 输出阵列dst的对应元素。

  该函数可以用于N维点的几何变换,任意线性颜色空间变换(诸如各种RGB到YUV变换),对图像通道进行混洗等。

这里有一个简洁的例子 InputArray 文件 (否则不相关):

std::vector<Point2f> vec;
// points or a circle
for( int i = 0; i < 30; i++ )
    vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)),
                          (float)(100 - 30*sin(i*CV_PI*2/5))));
cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20));

或者你可能只是转换 Point2f 变成一个 Mat 并乘以矩阵。


14
2017-10-30 04:09



非常感谢你。它完全符合我的要求,甚至还有一个已经充满变换点的矢量。还有我在同一文档页面中也想要的其他一些功能。超级实用。 - leinaD_natipaC
很好,我必须记住这个。 - beaker


答案:


cv::transform 用于转换具有变换矩阵的点。

N通道阵列src的每个元素被解释为N元素向量,其使用M×N或M×(N + 1)矩阵m变换为M元素向量 - 输出阵列dst的对应元素。

  该函数可以用于N维点的几何变换,任意线性颜色空间变换(诸如各种RGB到YUV变换),对图像通道进行混洗等。

这里有一个简洁的例子 InputArray 文件 (否则不相关):

std::vector<Point2f> vec;
// points or a circle
for( int i = 0; i < 30; i++ )
    vec.push_back(Point2f((float)(100 + 30*cos(i*CV_PI*2/5)),
                          (float)(100 - 30*sin(i*CV_PI*2/5))));
cv::transform(vec, vec, cv::Matx23f(0.707, -0.707, 10, 0.707, 0.707, 20));

或者你可能只是转换 Point2f 变成一个 Mat 并乘以矩阵。


14
2017-10-30 04:09



非常感谢你。它完全符合我的要求,甚至还有一个已经充满变换点的矢量。还有我在同一文档页面中也想要的其他一些功能。超级实用。 - leinaD_natipaC
很好,我必须记住这个。 - beaker