我正在尝试使用cvPerspectiveTransform
转换四个2D点。我已经通过cvFindHomography
获得了转换矩阵(3x3)。我无法弄清楚提供什么样的结构不会遇到一些错误。
有人会如此善良地告诉我如何用这些点来做到这一点吗?
我在Win上使用OpenCV 2.4.0。
答案 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处理变换,因为它的大小和类型更容易跟踪,并且可以在调试器中更容易地查看其内容。