cvPerspectiveTransform:我应该提供什么?

时间:2012-10-16 16:28:31

标签: opencv augmented-reality transformation homography

我正在尝试使用cvPerspectiveTransform转换四个2D点。我已经通过cvFindHomography获得了转换矩阵(3x3)。我无法弄清楚提供什么样的结构不会遇到一些错误。 有人会如此善良地告诉我如何用这些点来做到这一点吗?

  • X:Y
  • 0:0
  • 640:0
  • 0:480
  • 640:480

我在Win上使用OpenCV 2.4.0。

2 个答案:

答案 0 :(得分:1)

这是正确初始化矩阵的一种方法。它可能不是最优雅的,但它有效:

CvMat* input = cvCreateMat(1, 4, CV_32FC2);
CvMat* output = cvCreateMat(1, 4, CV_32FC2);

float data[8] = {0,0,0,640,480,0,640,480};

for (int i =0; i < 8; i++)
{
    input->data.fl[i] = data[i];
}

cvPerspectiveTransform(input, output, matrix_from_cvFindHomography);

C ++ API提供了更直观的实现。许多OpenCV函数,如perspectiveTransform,接受点的向量作为输入,可以这种方式初始化:

std::vector<cv::Point2f> inputs;
std::vector<cv::Point2f> outputs;

inputs.push_back(cv::Point2f(0,0));
inputs.push_back(cv::Point2f(640,0));
inputs.push_back(cv::Point2f(0,480));
inputs.push_back(cv::Point2f(640,480));

cv::perspectiveTransform(inputs, outputs, matrix_from_findHomography);

答案 1 :(得分:0)

假设你有一个3x3 cv :: Mat浮点数,你可以将其转换为(如果你想将所有f的双重改变为d's)

cv::Matx33f transform(your_cv_Mat);
cv::Matx31f pt1(0,0,1);
cv::Matx31f pt2(640,0,1);
...
pt1 = transform*pt1;
pt2 = transform*pt2;
...

确保通过第三个坐标进行标准化,如果没有意义,请阅读同质坐标

pt1 *= 1/pt1(2);
pt2 *= 1/pt2(2);
...
cv::Point2f final_pt1(pt1(0),pt1(1));
cv::Point2f final_pt2(pt2(0),pt2(1));

您不需要使用Matx执行此操作,它也可以与cv :: Mat一起使用。我个人喜欢Matx处理变换,因为它的大小和类型更容易跟踪,并且可以在调试器中更容易地查看其内容。