#android #image-processing #opencv
#Android #обработка изображений #opencv
Вопрос:
Я использую OpenCV 2.3.1 в Android. Мне нужно обрезать изображение пополам. То, что я делаю, это:
Mat mIntermediateMat2 = new Mat(frame_height,frame_width,rgba.type);
mIntermediateMat2 = rgba.clone();
mIntermediateMat2 = mIntermediateMat2.rowRange(0,frame_height/2);
Будет ли третий шаг выполнять эту работу или мне нужно добавить что-то еще?
Я видел Mat::operator() в документации opencv 2.3, но, к сожалению, не смог найти в пакете opencv Android.
Комментарии:
1. Вы пробовали делать это так, как вы предложили выше, и это не сработало?
Ответ №1:
Существует несколько конструкторов для класса Mat, один из которых принимает Mat и ROI (область интереса).
Вот как это сделать в Android / Java:
Mat uncropped = getUncroppedImage();
Rect roi = new Rect(x, y, width, height);
Mat cropped = new Mat(uncropped, roi);
Комментарии:
1. просто чтобы уточнить рентабельность инвестиций. x, y — это начальное местоположение прямоугольника, которое вы хотите установить в качестве roi, а width — height — это ширина — высота прямоугольника. это не ширина — высота изображения. так, например, если у вас есть изображение размером 320 * 240 и вы хотите разделить это изображение на 2 новых изображения. первый roi будет Rect roi = new Rect(0, 0, ширина / 2, высота); второй Rect roi = new Rect(160, 0, ширина / 2, высота);
2. idk почему, но эта логика дает мне исключение
Ответ №2:
Я всегда делал обрезку таким образом:
Mat image = ...; // fill it however you want to
Mat crop(image, Rect(0, 0, image.cols, image.rows / 2)); // NOTE: this will only give you a reference to the ROI of the original data
// if you want a copy of the crop do this:
Mat output = crop.clone();
Надеюсь, это поможет!
Комментарии:
1. Спасибо за вашу помощь. Если я использую обрезку мата для обнаружения объектов, не клонируя его для вывода. будет ли opencv искать функции в обрезанной части или в полном изображении?
Ответ №3:
Кажется, cv::getRectSubPix делает то, что вы хотите. Кроме того, вам не нужно выделять больше места, чем вам нужно. Также он выполняет необходимые интерполяции, если обрезанная область не выровнена по точному пикселю.
Это должно делать то, что вы хотите. Тип ввода будет типом вывода.
Mat dst;
getRectSubPix(src, Size(src.rows()/2,src.cols()), Point2f(src.rows()/4, src.cols()/2), dst);