OpenCV (Java) submat не имеет общего буфера с родительским матом? - PullRequest
3 голосов
/ 10 октября 2019

Из того, что я прочитал онлайн , когда вы создаете субмат в OpenCV, он разделяет буфер изображения родительского мата:

enter image description here

Однако, похоже, что это не то поведение, которое я получаю при использовании OpenCV из Java на Android.

Вот фрагмент кода, который создает подматрицу, а затем заполняет ее сплошным синим цветом. Однако исходный мат остается нетронутым при визуализации на экране:

//Create submat
submat1 = input.submat(new Rect(sub1pointA, sub1pointB));

//Fill submat with solid color
Imgproc.rectangle(
    submat1 ,
    new Point(0,0),
    new Point(submat1.width(), submat1.height()),
    new Scalar(0, 0, 255), -1);

Если, однако, я изменю вызов на rectangle() для работы на мате input, тоЯ действительно получаю сплошной синий прямоугольник на экране. Что дает? Я что-то упускаю из виду или субмат не разделяет буфер со своим родителем при использовании OpenCV для Java?

1 Ответ

0 голосов
/ 20 октября 2019

Я разобрался в проблеме. Код работал в цикле (так как каждый кадр получен с камеры), а не только один раз. Субмат создавался только в первый раз в цикле, потому что он должен совместно использовать буфер родителя, поэтому он должен обновляться при обновлении родителя следующим кадром с камеры. Проблема заключалась в том, что я поворачивал рамку с камеры на месте перед тем, как передать ее в свою функцию обработки:

Core.rotate(frame, frame, Core.ROTATE_90_COUNTERCLOCKWISE);
processFrame(frame);

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

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

Core.rotate(frame, rotatedFrame, Core.ROTATE_90_COUNTERCLOCKWISE);
processFrame(rotatedFrame);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...