2014-05-24 15 views
6

Sto cercando di trovare un semplice algoritmo per ritagliare (rimuovere le aree nere) di un'immagine panoramica creata con il modulo OpenCV Stitcher.Ritaglio dell'immagine panoramica in OpenCV

La mia idea è quella di calcolare i punti neri più interni nell'immagine che definiranno l'area di ritaglio, come mostrato nella seguente immagine:

enter image description here

:

enter image description here

Risultato atteso ritagliata

Ho provato i prossimi due approcci, ma non ritagliano l'immagine come previsto:

Primo approccio:

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

Secondo approccio:

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

Si dovrebbe dare più descrizione del problema. Sembra che stia ritagliando troppo, visto che stai attraversando ogni riga fino a quando non c'è il nero (sì?). Dovrai pensare a un nuovo modo di definire l'area ottimale; non esiste un'unica risposta corretta (e in quanto tale, non è una buona soluzione per SO). – Dave

+0

il problema è che in realtà non sta ritagliando l'immagine. Penso che i miei approcci non stiano trovando i punti interni correttamente. – PerracoLabs

+1

Dai un'occhiata alla mia risposta in http://stackoverflow.com/questions/21410449/how-do-i-crop-to-largest-interior-bounding-box-in-opencv/21479072#21479072 – Micka

risposta

-1

ho mai usato il calss cucitrice, ma penso che si può ottenere la matrice omografia stimato ad ogni coppia di immagini, se si potesse ottenerla facilmente, quindi puoi moltiplicarlo con gli angoli della prima immagine originale e quindi per l'angolo dell'ultima originale, otterrai la loro coordinata cucita, quindi otterrai il minimo delle coordinate x di sinistra e di destra e il minimo di alto e basso coordinate y di ciascuna immagine. È possibile ottenere le coordinate di ciascuna immagine cucita, ciò che è necessario fare in alcuni casi di ritaglio.