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:
: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);
}
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
il problema è che in realtà non sta ritagliando l'immagine. Penso che i miei approcci non stiano trovando i punti interni correttamente. – PerracoLabs
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