2014-05-24 18 views
6

Próbuję znaleźć prosty algorytm do przycinania (usuwania czarnych obszarów) obrazu panoramicznego utworzonego za pomocą modułu Stitcher openCV.Kadrowanie obrazu panoramy w OpenCV

Mój pomysł jest do obliczenia najbardziej wewnętrzne czarne punkty na obrazie, który będzie określać obszar kadrowania, jak pokazano w następnym obrazie:

enter image description here

Zakładana przycięte wynik:

enter image description here

Próbowałem dwóch następnych podejść, ale one nie przycinają obrazu zgodnie z oczekiwaniami:

Pierwsze podejście:

void testCropA(cv::Mat& image) 
{ 
    cv::Mat gray; 
    cvtColor(image, gray, CV_BGR2GRAY); 

    Size size = gray.size(); 
    int type = gray.type(); 
    int left = 0, top = 0, right = size.width, bottom = size.height; 

    cv::Mat row_zeros = Mat::zeros(1, right, type); 
    cv::Mat col_zeros = Mat::zeros(bottom, 1, type); 

    while (countNonZero(gray.row(top) != row_zeros) == 0) { top++; } 

    while (countNonZero(gray.col(left) != col_zeros) == 0) { left++; } 

    while (countNonZero(gray.row(bottom-1) != row_zeros) == 0) { bottom--; } 

    while (countNonZero(gray.col(right-1) != col_zeros) == 0) { right--; } 

    cv::Rect cropRect(left, top, right - left, bottom - top); 
    image = image(cropRect); 
} 

Drugie podejście:

void testCropB(cv::Mat& image) 
{ 
    cv::Mat gray; 
    cvtColor(image, gray, CV_BGR2GRAY); 

    int minCol = gray.cols; 
    int minRow = gray.rows; 
    int maxCol = 0; 
    int maxRow = 0; 

    for (int i = 0; i < gray.rows - 3; i++) 
    { 
     for (int j = 0; j < gray.cols; j++) 
     { 
      if (gray.at<char>(i, j) != 0) 
      { 
       if (i < minRow) {minRow = i;} 
       if (j < minCol) {minCol = j;} 
       if (i > maxRow) {maxRow = i;} 
       if (j > maxCol) {maxCol = j;} 
      } 
     } 
    } 

    cv::Rect cropRect = Rect(minCol, minRow, maxCol - minCol, maxRow - minRow); 
    image = image(cropRect); 
} 
+0

Powinieneś podać dokładniejszy opis problemu. Wygląda na to, że przycina się o wiele za dużo, ponieważ przechodzisz przez każdy rząd, aż nie ma czarnego (tak?). Będziesz musiał wymyślić nowy sposób na określenie optymalnego obszaru; nie ma jednej poprawnej odpowiedzi (i jako taka nie nadaje się do SO). – Dave

+0

Problem polega na tym, że w rzeczywistości nie przycina się obrazu. Myślę, że moje podejście nie znajduje poprawnie wewnętrznych punktów. – PerracoLabs

+1

Zapoznaj się z moją odpowiedzią na http://stackoverflow.com/questions/21410449/how-do-i-crop-to-largest-interior-bounding-box-in-opencv/21479072#21479072 – Micka

Odpowiedz

-1

nigdy nie użyłem calss Stitcher, ale myślę, że można uzyskać szacunkową matrycę homography przy każdej pary zdjęć, jeśli można to uzyskać łatwo, możesz go pomnożyć z rogami pierwszego oryginalnego obrazu, a więc dla rogu ostatniego oryginalnego, otrzymasz ich szytą współrzędną, następnie uzyskasz min lewej i prawej współrzędnej x oraz min do góry i dołu Współrzędne Y każdego obrazu. Możesz uzyskać współrzędne każdego szytego obrazu, co musisz zrobić w niektórych przypadkach przycinania.

Powiązane problemy