C++ OpenCV-使用单应矩阵计算正确的坐标
给定单应矩阵H(3x3),如何在变换后的图像中找到正确的坐标(x,y)?我明白在openCV中我可以使用C++ OpenCV-使用单应矩阵计算正确的坐标,c++,opencv,image-processing,matrix,homography,C++,Opencv,Image Processing,Matrix,Homography,给定单应矩阵H(3x3),如何在变换后的图像中找到正确的坐标(x,y)?我明白在openCV中我可以使用 perspectiveTransform( obj_corners, scene_corners, H); 其中,obj_角点是原始图像中的坐标,场景_角点是结果图像中的坐标。我认为计算公式应该是: w = H_31 * obj_corners[i].x + H_32 * obj_corners[i].y + H_33 * 1; scene_corners[i].x
perspectiveTransform( obj_corners, scene_corners, H);
其中,obj_角点是原始图像中的坐标,场景_角点是结果图像中的坐标。我认为计算公式应该是:
w = H_31 * obj_corners[i].x + H_32 * obj_corners[i].y + H_33 * 1;
scene_corners[i].x = (H_11 * obj_corners[i].x + H_12 * obj_corners[i].y + H_13 * 1) / w;
scene_corners[i].y = (H_21 * obj_corners[i].x + H_22 * obj_corners[i].y + H_23 * 1) / w;
现在我有一个转换矩阵H,H=[95,41,246;51160,8;240,63240]。如果我的obj_角点是(0,0),使用上面的公式,场景_角点应该是(246/240,8/240)。但是,当我使用openCV perspectiveTransform()函数时,场景的角点是(17.56,-12.98)。为什么这里有一个错误的匹配
我从cv::findHomography()函数中得到了矩阵H的变换。我知道(0,0)-->(17.56,-12.98)的答案是正确的。我只是不知道如何计算这个坐标。特别是如何在这里得到一个负数
更清楚地说,我的openCV代码输出错误,如下所示:
cv::Mat H = cv::findHomography(trackedPoints2, trackedPoints1, CV_RANSAC);
double H11 = H.data[0];
double H12 = H.data[1];
double H13 = H.data[2];
double H21 = H.data[3];
double H22 = H.data[4];
double H23 = H.data[5];
double H31 = H.data[6];
double H32 = H.data[7];
double H33 = H.data[8];
int x = 0, y = 0;
int w = H31 * x + H32 * y + H33;
double x_dst = ((H11 * x + H12 * y + H13) + w / 2) / w;
double y_dst = ((H21 * x + H22 * y + H23) + w / 2) / w;
下面是openCV代码给出的正确答案(17.56,-12.98)
cv::Mat H=cv::findHomography(trackedPoints2,trackedPoints1,cv_RANSAC);
std::向量对象角(1);
obj_角点[0]=cvPoint(0,0);
std::矢量场景_角(1);
透视变换(obj_角、场景_角、H);
printf(“%f,%f\n”,场景角[0].x,场景角[0].y);
有人能告诉我这里出了什么问题吗?谢谢。事实上,如果描述单应性的矩阵的所有系数都是正值,那么x,y=0,0的变换很难得到负值!查看文件
opencv2.4-8/modules/core/src/matmult.cpp
以了解perspectivetransform()
是如何实现的。除了+w/2
之外,它与您的代码非常接近。此外,由于w
被类型化为int,因此w/2是整数除法,并且存在H31*x+…
到int的隐式转换:那里可能有问题!但修复这个问题无助于得到负值……嗨,弗朗西斯,谢谢你的回复。是的,w/2部分不太正确。当我将x_-dst和y_-dst定义为“int”时,它是作为圆形效果编写的。在当前的“double”实现中,这两个值都将为+0.5。然而,正如你所说,我不知道如何用这个单应矩阵得到负值的正确答案。
cv::Mat H = cv::findHomography(trackedPoints2, trackedPoints1, CV_RANSAC);
std::vector<Point2f> obj_corners(1);
obj_corners[0] = cvPoint(0, 0);
std::vector<Point2f> scene_corners(1);
perspectiveTransform(obj_corners, scene_corners, H);
printf("%f, %f\n", scene_corners[0].x, scene_corners[0].y);