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

时间:2015-01-16 09:51:15

标签: c opencv

我有用于轮换的矩阵:

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

此矩阵用于图像操作。

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

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

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

3 个答案:

答案 0 :(得分:3)

我在forum找到了答案。以防链接失败是解决方案:

cv::Point2f operator*(cv::Mat M, const cv::Point2f& p)
{ 
    cv::Mat_<double> src(3/*rows*/,1 /* cols */); 

    src(0,0)=p.x; 
    src(1,0)=p.y; 
    src(2,0)=1.0; 

    cv::Mat_<double> dst = M*src; //USE MATRIX ALGEBRA 
    return cv::Point2f(dst(0,0),dst(1,0)); 
} 

答案 1 :(得分:1)

如果您已经将信息存储在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 <iostream>
#include <opencv2/core/core.hpp>

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;
}

答案 2 :(得分:-2)

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

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];