2013-05-16 103 views
2

使用SURF在場景中查找參考圖像時,我想裁剪找到的場景中的物體,並使用warpPerspective將其「回正」單應矩陣。

含義,讓我們說我有這個SURF結果:
enter image description here

現在,我想裁剪找到的對象場景:
enter image description here

和 「拉直」 只有使用反轉的單應性矩陣,使用warpPerspective裁剪圖像。我所瞄準的結果是,我將得到一幅圖像,大致只包含對象,以及原始場景中的一些扭曲的殘留物(因爲裁剪不是單獨的100%對象)。

裁剪找到的對象,並找到單應性矩陣並反轉它很簡單。問題是,我似乎無法理解warp的結果。看起來像所產生的圖像僅包含裁剪圖像的一小部分,並且尺寸非常大。
在研究warpPerspective期間,我發現由於過程的性質而產生的圖像非常大,但我似乎無法圍繞如何正確地做到這一點。好像我只是不理解這個過程。我是否需要扭曲查看原始(未裁剪)的圖像,然後裁剪「拉直」的對象?

有什麼建議嗎?OpenCV 2.4.3 - 在裁剪後的圖像上具有反轉單應矩陣的warpPerspective

+0

喜做ü找到任何解決辦法? – user1140237

+0

不幸的是,我不得不離開這個來處理另一個項目,但這絕對是我會回頭的。如果你確實想出了一個解決方案,如果你能發佈你的發現,那將是非常好的! –

+0

米能夠建立圖書館使用衝浪和篩選兩個,但問題是我必須爲Android實施..所以工作... ... – user1140237

回答

1

試試這個。

考慮到您的對象的輪廓不相關(例如,框輪廓的外角點),您可以使用逆單應矩陣將它們轉換並調整該單應矩陣以將該轉換的結果放置到左上角區域圖片。

  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);

希望這有助於=)