gpt4 book ai didi

OpenCV 2.4.3 - warpPerspective 在裁剪图像上具有反向单应性

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:41 27 4
gpt4 key购买 nike

当使用 SURF 在场景中查找引用图像时,我想在场景中裁剪找到的对象,并使用 warpPerspective 和反向单应矩阵将其“拉直”。

意思是,假设我有这个 SURF 结果:
enter image description here

现在,我想裁剪场景中找到的对象:
enter image description here

并使用反向单应矩阵仅“拉直”带有 warpPerspective 的裁剪图像。我的目标是得到一张大致只包含对象的图像,以及原始场景中一些扭曲的残留物(因为裁剪不是 100% 单独对象)。

裁剪找到的对象,找到单应性矩阵并反转它非常简单。问题是,我似乎无法理解 warpPerspective 的结果。看起来生成的图像只包含裁剪图像的一小部分,而且尺寸非常大。
在研究 warpPerspective 时,我发现由于过程的性质,生成的图像非常大,但我似乎无法理解如何正确地做到这一点。好像我只是不太了解这个过程。我是否需要对原始(未裁剪)图像进行 warpPerspective 而不是裁剪“拉直”对象?

有什么建议吗?

最佳答案

试试这个。

鉴于您有对象的未连接轮廓(例如,框轮廓的外角点),您可以使用逆单应性对它们进行变换,并调整该单应性以将该变换的结果放置在左上角区域图片。

  1. 计算这些对象点将被扭曲到的位置(使用逆单应性和轮廓点作为输入):

    cv::Rect computeWarpedContourRegion(const std::vector<cv::Point> & points, const cv::Mat & homography)
    {
    std::vector<cv::Point2f> transformed_points(points.size());

    for(unsigned int i=0; i<points.size(); ++i)
    {
    // warp the points
    transformed_points[i].x = points[i].x * homography.at<double>(0,0) + points[i].y * homography.at<double>(0,1) + homography.at<double>(0,2) ;
    transformed_points[i].y = points[i].x * homography.at<double>(1,0) + points[i].y * homography.at<double>(1,1) + homography.at<double>(1,2) ;
    }

    // dehomogenization necessary?
    if(homography.rows == 3)
    {
    float homog_comp;
    for(unsigned int i=0; i<transformed_points.size(); ++i)
    {
    homog_comp = points[i].x * homography.at<double>(2,0) + points[i].y * homography.at<double>(2,1) + homography.at<double>(2,2) ;
    transformed_points[i].x /= homog_comp;
    transformed_points[i].y /= homog_comp;
    }
    }

    // now find the bounding box for these points:
    cv::Rect boundingBox = cv::boundingRect(transformed_points);
    return boundingBox;
    }
  2. 修改您的逆单应性(computeWarpedContourRegion 的结果和 inverseHomography 作为输入)

    cv::Mat adjustHomography(const cv::Rect & transformedRegion, const cv::Mat & homography)
    {
    if(homography.rows == 2) throw("homography adjustement for affine matrix not implemented yet");

    // unit matrix
    cv::Mat correctionHomography = cv::Mat::eye(3,3,CV_64F);
    // correction translation
    correctionHomography.at<double>(0,2) = -transformedRegion.x;
    correctionHomography.at<double>(1,2) = -transformedRegion.y;


    return correctionHomography * homography;
    }
  3. 你会这样称呼

cv::warpPerspective(objectWithBackground, output, adjustedInverseHomography, sizeOfComputeWarpedContourRegionResult);

希望这有帮助 =)

关于OpenCV 2.4.3 - warpPerspective 在裁剪图像上具有反向单应性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16587274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com