C++ 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

给定单应矩阵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 = (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);