2014-01-21 2 views
1

От this post Я взял следующий код. Он обрабатывает область с исходного изображения, используя OpenCV4Android.Обрезка изображения без переопределения объекта назначения

Mat uncropped = getUncroppedImage(); 
Rect roi = new Rect(x, y, width, height); 
Mat cropped = new Mat(uncropped, roi); 

работает хорошо, но представьте себе память для Мата, который возвращается getUncroppedImage выделяется только один раз. Но память для обрезанного изображения перераспределяется все время. Есть ли способ обрезать область из OpenCV: Mat без использования Mat-constructor?

ответ

3

@Matthias, «обрезанное» изображение в ваших кодах указывает на ту же память, что и «uncropped». Память не перераспределяется. Чтобы проверить это, вы можете изменить содержимое обрезанного изображения (например, установите его как белый), и вы увидите, что содержимое необрезанных также будет изменено.

В OpenCV, если вы хотите, чтобы два изображения имели одинаковое содержимое, но различную память, вы должны сказать это явно, то есть использовать такие функции, как copy, copyTo или clone. OpenCV пытается избежать перераспределения памяти и копирования по возможности.

+0

Правильно, прочитав немного больше в документации, я понял, что они разделяют память. – Matthias

0

Да, вы можете просто использовать Растр:

Mat uncropped = getUncroppedImage(); 
Rect roi = new Rect(x, y, width, height); 

Mat cropped = uncropped(roi); 

таким образом, укороченные используют одни и те же данные массива изображения неподрезано, но только в области Растр. Создается матричный заголовок , но массив пикселей пикселей (это то, что дорого) не является.

почти все функции OpenCV могут работать на подизображения, потому что Theyre так же, как обычные изображения с другой (длиной байта одной строки) widthstep

редактировать: это я с ++ синтаксис, не знает, как андроид OpenCV отличается!

+0

Спасибо за подсказку. Я попробую это. – Matthias

+0

Android: Mat cutped = uncropped.submat (roi); –

Смежные вопросы