2016-04-21 12 views
0

Ich bin neu bei OpenCV und habe gehofft Hilfe bei einem Projekt zu bekommen, an dem ich arbeite. Ich möchte den Vordergrund vom Hintergrund trennen und die Größe des Originals so anpassen, dass der Vordergrund passt.Größenanpassung/Zuschneiden eines Bildes mit Opencv

Ich habe diese Probe, und ich möchte in der Lage sein, um ein optimales Ergebnis wie folgt zu erhalten:

Vor
enter image description here

Nach
enter image description here

Antwort

1

einem einfachen Code nur um eine Idee zu geben. Es funktioniert gut für Bilder wie Ihres.

(Anmerkung: Ich verwendet, um dieses code teilweise)

#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; 
}