2016-04-21 142 views
0

我是OpenCV的新手,希望能够在我正在进行的项目中获得帮助。我想要将前景与背景分开,并调整/裁剪原始图像以使前景适合。使用Opencv调整图像大小/裁剪图像

我有这个样,我想能够得到这样一个最佳结果:

以前
enter image description here


enter image description here

回答

1

简单代码只是为了给出一个想法。它适用于像你这样的图像。

(注:我用这个code部分)

#include "opencv2/opencv.hpp" 

using namespace cv; 
using namespace std; 

int main(int argc, char** argv) 
{ 
    int largest_area=0; 
    int largest_contour_index=0; 
    cv::Rect bounding_rect; 

    Mat src = imread(argv[1]); 
    Mat edges; 

    cvtColor(src, edges, COLOR_BGR2GRAY); //Convert to gray 
    GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); 
    Canny(edges, edges, 0, 50, 3); 
    dilate(edges,edges,Mat(),Point(-1,-1),3); 
    erode(edges,edges,Mat(),Point(-1,-1),3); 

    vector<vector<cv::Point> > contours; // Vector for storing contour 

    findContours(edges, contours,CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE); // Find the contours in the image 

    for(int i = 0; i< contours.size(); i++) // iterate through each contour. 
    { 
     double a=contourArea(contours[i],false); // Find the area of contour 
     if(a>largest_area) 
     { 
      largest_area=a; 
      largest_contour_index=i;    //Store the index of largest contour 
      bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour 
     } 
    } 

    // ------------ 
    // makes border 
    bounding_rect.x -= 10; 
    bounding_rect.y -= 10; 
    bounding_rect.width += 20; 
    bounding_rect.height += 20; 
    bounding_rect = Rect(0,0,src.cols,src.rows) & bounding_rect; 
    // ------------ 

    Mat biggest_contour_rect = src(bounding_rect).clone(); 
    imshow("biggest_contour_rect", biggest_contour_rect); 
    waitKey(0); 
    return 0; 
}