我正在尝试使用cvPerspectiveTransform
来转换四个 2D 点。我已经通过cvFindHomography
. 我无法弄清楚要提供什么样的结构才不会遇到一些错误。有人会这么好心地告诉我如何处理这些问题吗?
- x:y
- 0:0
- 640:0
- 0:480
- 640:480
我在 Win 上使用 OpenCV 2.4.0。
我正在尝试使用cvPerspectiveTransform
来转换四个 2D 点。我已经通过cvFindHomography
. 我无法弄清楚要提供什么样的结构才不会遇到一些错误。有人会这么好心地告诉我如何处理这些问题吗?
我在 Win 上使用 OpenCV 2.4.0。
这是正确初始化矩阵的一种方法。它可能不是最优雅的,但它有效:
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);
假设您有一个 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 处理转换,因为它的大小和类型更容易跟踪,并且它的内容可以更容易地在调试器中查看。