2

我正在尝试使用cvPerspectiveTransform来转换四个 2D 点。我已经通过cvFindHomography. 我无法弄清楚要提供什么样的结构才不会遇到一些错误。有人会这么好心地告诉我如何处理这些问题吗?

  • x:y
  • 0:0
  • 640:0
  • 0:480
  • 640:480

我在 Win 上使用 OpenCV 2.4.0。

4

2 回答 2

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);
于 2012-10-16T17:55:54.830 回答
0

假设您有一个 3x3 cv::Mat 的浮点数,您可以将其转换为(如果您想将所有 f 都更改为 d)

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 处理转换,因为它的大小和类型更容易跟踪,并且它的内容可以更容易地在调试器中查看。

于 2012-10-16T16:39:52.150 回答