OpenCV(Java)子mat似乎没有与父mat共享缓冲区?

And*_*Dev 5 java android opencv

根据我在网上阅读的内容,当您在 OpenCV 中制作子垫时,它会共享父垫的图像缓冲区:

在此输入图像描述

然而,这似乎不是我在 Android 上使用 Java 中的 OpenCV 时遇到的行为。

这是一个制作子垫的片段,然后用纯蓝色填充它。然而,当渲染到屏幕上时,原始垫子保持不变:

//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);
Run Code Online (Sandbox Code Playgroud)

但是,如果我将调用更改为在垫子rectangle()上进行操作input,那么我确实会在屏幕上看到一个纯蓝色矩形。是什么赋予了?我是否遗漏了一些明显的东西,或者在使用 OpenCV for Java 时子垫不与其父项共享缓冲区?

And*_*Dev 0

我想通了这个问题。该代码在循环中运行(因为从相机接收到每一帧),而不仅仅是一次。子垫仅在循环中第一次创建,因为它应该共享父级的缓冲区,因此当父级使用相机的下一帧更新时,它应该得到更新。问题是我在将相机的框架传递到我的处理函数之前将其旋转到位:

Core.rotate(frame, frame, Core.ROTATE_90_COUNTERCLOCKWISE);
processFrame(frame);
Run Code Online (Sandbox Code Playgroud)

看起来,当旋转 90 度时,后备阵列会被重新分配(我认为这是有道理的,因为行数和列数会颠倒),并且这种重新分配会破坏与先前创建的子垫的链接。

如果我不就地旋转,而是旋转到单独的 Mat 上,然后将该 Mat 传递给我的处理函数,那么一切都会按预期工作(我在屏幕上看到一个蓝色矩形)。

Core.rotate(frame, rotatedFrame, Core.ROTATE_90_COUNTERCLOCKWISE);
processFrame(rotatedFrame);
Run Code Online (Sandbox Code Playgroud)