OpenCV的。 如何乘以点和矩阵(CvMat)

我有用于旋转的矩阵:

CvMat* rot_mat = cvCreateMat(2, 3, CV_32FC1); cv2DRotationMatrix(center, angle, scale, rot_mat); ... 

该矩阵用于图像操作。

 cvWarpAffine(..., ..., rot_mat, ..., ...); 

我必须知道,这个矩阵应该如何影响精确的像素 – 它应该被转移的位置。

如何将2D点(像素位置)和我的矩阵相乘以找出应该转移像素的位置?

我在这个论坛上找到了答案。 以防链接失败,这是解决方案:

 cv::Point2f operator*(cv::Mat M, const cv::Point2f& p) { cv::Mat_ src(3/*rows*/,1 /* cols */); src(0,0)=px; src(1,0)=py; src(2,0)=1.0; cv::Mat_ dst = M*src; //USE MATRIX ALGEBRA return cv::Point2f(dst(0,0),dst(1,0)); } 

如果您已经将信息存储在cv :: Point元素中,则可以使用cv :: Mat构造函数将该信息转换为无内存副本的矩阵,如

 cv::Mat V = cv::Mat(v, false); // false to avoid memory copy 

使用’V’进行操作后,您可以返回原始结构

  V.copyTo( cv::Mat(p, false) ); 

您可以使用相同的构造函数解析它们的单个点或列表(std :: vector)。 此示例代码可以更好地显示该想法:

 #include  #include  int main( ) { std::vector< cv::Point2f > v(3); v[0] = cv::Point2f(1, 1); v[1] = cv::Point2f(2, 2); v[2] = cv::Point2f(3, 3); cv::Mat V = cv::Mat(v, false); // false to avoid memory copy std::vector< cv::Point2f > p(3); V.copyTo( cv::Mat(p, false) ); for (int i = 0; i < 3; ++i) { std::cout << p[i] << std::endl; } return 0; } 

我为此实现了一些愚蠢的代码。 我想应该有更复杂的解决方案:

 CvMat* rot_mat; CvPoint* p; ... float* data = (float*)(rot_mat->data.ptr); float newX = data[0] * p->x + data[1] * p->y + data[2]; float newY = data[3] * p->x + data[4] * p->y + data[5];