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:
Zakładana przycięte wynik:
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);
}
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
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
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