gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:20:42 25 4
gpt4 key购买 nike

从什么I've read online ,当你在 OpenCV 中制作子垫时,它共享父垫的图像缓冲区:

enter image description here

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

这是一个制作子垫的 fragment ,然后用纯蓝色填充它。但是,原始垫子在呈现到屏幕上时保持不变:

//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 for Java 时子垫不与其父级共享缓冲区?

最佳答案

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

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

看起来当旋转 90 度时,支持数组被重新分配(我想这是有道理的,因为行数和列数会倒置),并且这种重新分配打破了与先前创建的子矩阵的链接.

如果我没有就地旋转,而是旋转到一个单独的垫子上,然后将该垫子传递给我的处理函数,那么一切都会按预期进行(我在屏幕)。

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

关于java - OpenCV(Java)子垫似乎没有与父垫共享缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58328152/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com