Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV 2.4.3-裁剪图像上的反向单应透视_Opencv_Surf_Homography - Fatal编程技术网

OpenCV 2.4.3-裁剪图像上的反向单应透视

OpenCV 2.4.3-裁剪图像上的反向单应透视,opencv,surf,homography,Opencv,Surf,Homography,使用SURF在场景中查找参考图像时,我希望在场景中裁剪找到的对象,并使用warpPerspective和反向单应矩阵将其“拉直”。 意思是,假设我有这个冲浪结果: 现在,我想裁剪场景中找到的对象: 以及使用反向单应矩阵仅“拉直”具有扭曲透视的裁剪图像。结果我的目标是,我将得到一个大致只包含对象的图像,以及原始场景中一些扭曲的残片(因为裁剪不是100%仅包含对象)。 裁剪找到的对象,找到单应矩阵并反转它就足够简单了。问题是,我似乎无法从另一个角度理解结果。结果图像似乎只包含裁剪图像的

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

意思是,假设我有这个冲浪结果:


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


以及使用反向单应矩阵仅“拉直”具有扭曲透视的裁剪图像。结果我的目标是,我将得到一个大致只包含对象的图像,以及原始场景中一些扭曲的残片(因为裁剪不是100%仅包含对象)。

裁剪找到的对象,找到单应矩阵并反转它就足够简单了。问题是,我似乎无法从另一个角度理解结果。结果图像似乎只包含裁剪图像的一小部分,而且大小非常大。
在研究透视图时,我发现由于处理过程的性质,生成的图像非常大,但我似乎不知道如何正确地进行处理。似乎我对这个过程还不够了解。我是否需要扭曲原始(未裁剪)图像,然后裁剪“拉直”对象?

有什么建议吗?

试试这个

假设您拥有对象的未连接轮廓(例如长方体轮廓的外角点),您可以使用反向单应性对其进行变换,并调整该单应性以将变换结果放置到图像的左上区域

  • 计算这些对象点将扭曲到的位置(使用反向单应和轮廓点作为输入):

    cv::Rect computeWarpedContourRegion(常数标准::向量和点,常数cv::矩阵和单应性)
    {
    std::向量变换的_点(points.size());
    
    对于(unsigned int i=0;ihi你找到任何解决方案了吗?不幸的是,我不得不留下这个来处理另一个项目,但这肯定是我要回去做的。如果你真的找到了解决方案,如果你能发布你的发现就太好了!我可以使用surf和sift两种方法来构建库,但问题是我必须为android实现。所以,工作吧在你的解释中“你可以用你的逆单应变换它们,并调整单应以将变换的结果放在图像的左上角区域”的“图像”是什么意思?假设我们有一个对象图像和一个场景图像。你是指对象图像吗?
    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;
    }
    
    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;
    }