Я пытаюсь разделить изображение на сетку и сохранить отдельные части. В данный момент я перебираю номер фрагмента и получаю субизображение, которое затем сохраняю.
Может кто-нибудь объяснить, как правильно получить субизображения? Я следил за подобными постами на stackoverflow, но мой код продолжает сбой утверждение, которое проверяет границы подизображения по сравнению с оригиналом.
int unitWidth = image.rows / n;
int unitHeight = image.cols / n;
for(int i=0; i<n; i++) {
//Take the next tile in the nxn grid. Unit is the width and height of
//each tile. i%n and i/n are just fancy ways of a double x,y for loop
Mat subImage = image(Rect((i % n) * unitWidth, (i / n) * unitHeight, unitWidth,unitHeight));
ostringstream oss;
oss << i << "_" << n << ".jpg";
string name = oss.str();
imwrite(name, subImage);
}
постскриптум первый образ не ломает программу, а второй (для сетки 2×2, так что конечная часть). Я укоротил субизображение на 10, но это все равно сломало машину.
Ниже ваш код исправлен так, что он разбивает изображение на nxn тайлы.
Во-первых, вы расчет unitWidth
а также unitHeight
неверно, и это является причиной ошибки подтверждения. Так должно быть:
int unitWidth = image.cols / n; // you had image.rows / n;
int unitHeight = image.rows / n; // " " image.cols / n;
Кроме того, если вы хотите использовать nxn, вам нужно выполнить цикл n ^ 2 раза, а не просто n раз.
Самый простой способ сделать это состоит в том, чтобы просто иметь два цикла, один внутри другого, один n-кратный для строк и другой n-ный цикл для столбцов.
for(int i = 0; i < n; i++) { //i is row index
// inner loop added so that more than one row of tiles written
for(int j = 0; j < n; j++) { // j is col index
//Take the next tile in the nxn grid. Unit is the width and height of
//each tile. i%n and i/n are just fancy ways of a double x,y for loop
// Mat subImage = image(Rect((i % n) * unitWidth, (i / n) * unitHeight, unitWidth, unitHeight));
// I didn't understand the above line, as ((i % n)==i and (i / n)==0.
//
Mat subImage = image(Rect(j * unitWidth, i * unitHeight, unitWidth, unitHeight));
ostringstream oss;
oss << i << "_" << j << ".jpg";
string name = oss.str();
imwrite(name, subImage);
}
}
Самый простой способ отладки подобного кода — сделать Rect отдельным объектом, чтобы вы могли распечатать его x, y, width, height и сравнить их с сообщением об утверждении OpenCV.
Вы компилировали свой код в режиме отладки?
cv::Rect roi(j * unitWidth, i * unitHeight, unitWidth, unitHeight);
cout << "(i, j) = (" << i << ", " << j << ")" << endl;
cout << "(i %n) = " << i%n << endl;
cout << "(i/n) = " << i/n << endl;
cout << "roi.x = " << roi.x << endl;
cout << "roi.y = " << roi.y << endl;
cout << "roi.width = " << roi.width << endl;
cout << "roi.height = " << roi.height << endl;
Mat subImage = image(roi);
for(int i = 0; i < n-unitHeight; i++) {
for(int j = 0; j < n-unitWidth; j++) {
...........
...........
...........
}
}