2013-09-05 5 views
0

Я пытаюсь разделить изображение на сетку и сохранить отдельные части. На данный момент я прокручиваю номер детали и получаю суб-изображение, которое затем сохраняю.Подматрица вне границ (OpenCV)

Может кто-нибудь объяснить, как правильно получить суб-изображения? Я слежу за аналогичными сообщениями в 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); 
} 

p.s. первый субимаж не нарушает программу, но второй делает (для сетки 2x2, так что конечная часть). Я сокращаю суб-изображение на 10, но это все еще сломало машину.

+0

«я% п и я/п просто фантазии пути двойным х, у, для цикла». Начиная с 'i% n == i' и' i/n == 0', и цикл повторяется n раз вместо требуемых nxn раз, как это выглядит причудливый цикл doouble. Даже если бы это было так, это было бы просто обфускацией без каких-либо преимуществ. – Bull

ответ

3

Ниже приведен ваш код, так что он разбивает изображение на 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 раз для столбцов.

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

Самый простой способ отладки кода, как это сделать Прямоугольник отдельный объект, так что вы можете распечатать его х, у, ширина, высота и проверить их против утверждения сообщения 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); 
+0

Это то же самое, вы просто используете 2 цикла вместо моего 1 цикла. Используя код, который вы здесь помещаете, я получаю ту же ошибку. На последней итерации первой строки (той, где прямой касается конца мата) он падает. – Mirror318

+0

@ Mirror318 это не то же самое, что и ваш код. Ваша петля могла писать только n изображений вместо n^2, необходимых для nxn-черепицы. Также '(i% n) == i' так почему бы просто не использовать' j'; и '(i/n) == 0', поэтому ваш код может только когда-либо разбивать первую строку. Кроме того, ваш расчет unitWidth и unitHeight ошибочен, и это приводит к сбою утверждения. Код, который я опубликовал, был протестирован, и он работает нормально. – Bull

+0

Правильно, цикл for должен был перейти к n * n. Во всяком случае, основной проблемой были ценности, которые я сохранил как ширину и высоту, спасибо за помощь! – Mirror318

0
for(int i = 0; i < n-unitHeight; i++) { 
    for(int j = 0; j < n-unitWidth; j++) { 
     ........... 
     ........... 
     ........... 
    } 
} 
Смежные вопросы