Ошибка установки ROI OpenCV Android

Я пытаюсь понять, как установить ROI для изображения в OpenCV на Android. Я сделал это в других операционных системах, поэтому я думаю, КАК я это делаю, семантически правильно, но где-то есть ошибка.

До сих пор я пробовал это

Rect roi = new Rect(0, 0, inputFrame.cols(), inputFrame.rows());
Mat cropped = new Mat(inputFrame, roi);

Однако я получаю ошибку где-то в классах OpenCV, которая выглядит так

Utils.matToBitmap() throws an exception:/home/reports/ci/slave/opencv/modules/java/generator/src/cpp/utils.cpp:107: 
error: (-215) src.dims == 2 && info.height == (uint32_t)src.rows && info.width ==
(uint32_t)src.cols in function void Java_org_opencv_android_Utils_nMatToBitmap2
(JNIEnv*, jclass, jlong, jobject, jboolean)

Я вызываю это в обратном вызове onCameraFrame, предоставляемом классом оболочки opencv.

Не знаете, как это сделать, кто-нибудь успешно это сделал?


person Jameo    schedule 04.02.2013    source источник


Ответы (2)


OpenCV для Android (и новый Java API) имеет собственный способ создания ROI.

Все, что вам нужно сделать, это вызвать метод submat вашего объекта Mat. Если я не ошибаюсь, вызов submat не создает копию этой области изображения, если вам нужна копия, вы можете использовать для этой цели copyTo на submat.

Mat roi = inputFrame.submat(rowStart, rowEnd, colStart, colEnd);

Вы можете вызвать submat 3 различными способами, проверьте ссылки для более подробной информации:

  • submat (int rowStart, int rowEnd, int colStart, int colEnd)

субмат 1

  • submat (диапазон rowRange, диапазон colRange)

подменю 2

  • субмат (прямая область)

submat 3

person Rui Marques    schedule 13.02.2013
comment
На самом деле я использую это, чтобы отображать некоторую обработку изображений, которую я выполняю, в другой части окна. Я на самом деле даже не думал, что это действительно то же самое, что ROI. Спасибо за ваш вклад!! - person Jameo; 13.02.2013
comment
Да, не стесняйтесь принять этот ответ вместо этого. Я думаю, что @karlphillip также согласится с тем, что этот метод более адекватен. - person Rui Marques; 13.02.2013
comment
Я выбрал ваш ответ, потому что он очень похож на то, что я использовал в конце. Но я считаю, что они почти идентичны по памяти - person Jameo; 13.02.2013
comment
@Jameo Это не круто делать, так как вы получили рабочий ответ от кого-то почти 10 дней назад. Но вам позволено делать то, что вы хотите. :) - person karlphillip; 14.02.2013

Ошибка указывает на то, что вы пытаетесь установить ROI с такими же размерами изображения, поэтому в этом случае ROI не нужен.

Чтобы убедиться, что это проблема, должно работать следующее:

Rect roi = new Rect(0, 0, inputFrame.cols() - 1, inputFrame.rows() - 1);
Mat cropped = new Mat(inputFrame, roi);
person karlphillip    schedule 04.02.2013
comment
Да, я изменил его на все изображение, потому что у меня были проблемы с недопустимым размером обрезки. Ваш код выше тоже не работает. Похоже, это связано только с этим вызовом Utils.matToBitmap() (на самом деле я прошел через это, и до этого все выглядело нормально). Любая идея, почему изменение ROI может повлиять на это? - person Jameo; 05.02.2013
comment
Это случайно, но могло вызвать мою проблему, есть ли разница между img.copyTo(img2) и img2 = img.clone()? - person Jameo; 06.02.2013
comment
Mat::copyTo против Mat::clone. Кажется, что copyTo() учитывает ROI, если он установлен, а clone() игнорирует его. - person karlphillip; 06.02.2013
comment
Спасибо за помощь, я разобрался!! - person Jameo; 06.02.2013