使用Opencv调整图像大小/裁剪图像

时间:2016-04-21 00:59:03

标签: c++ opencv crop image-resizing image-segmentation

我是OpenCV的新手,希望能够为我正在开展的项目寻求帮助。我想将前景与背景分开并调整/裁剪原始图像,使前景适合。

我有这个样本,我希望能够得到这样的最佳结果:

之前
enter image description here


enter image description here

1 个答案:

答案 0 :(得分:2)

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

(注意:我部分地使用了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;
}