OpenCV(Java)子垫似乎不与父垫共享缓冲区?

问题描述 投票:3回答:1

I've read online中,当您在OpenCV中创建子垫时,它共享父垫的图像缓冲区:

enter image description here

但是,这似乎不是我在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);

但是,如果我将调用更改为rectangle()以在input垫上进行操作,则确实在屏幕上确实得到了一个蓝色实心矩形。是什么赋予了?使用Java的OpenCV时,我是否遗漏了明显的东西,还是子垫未与其父共享缓冲区?

java android opencv
1个回答
0
投票

我知道了这个问题。代码在循环中运行(因为从相机接收到每一帧),而不仅仅是一次。子垫只在循环中第一次创建,因为它应该共享父对象的缓冲区,因此当父对象使用相机的下一帧进行更新时,应该会对其进行更新。问题是我在将镜头传递到我的处理功能之前正在旋转镜头[[in-place的框架:

Core.rotate(frame, frame, Core.ROTATE_90_COUNTERCLOCKWISE); processFrame(frame);
似乎旋转90度时,将重新分配衬背数组(由于行和列的数量将被反转,所以我认为这很有意义),并且这种重新分配会断开与先前创建的子垫的链接。 

如果我不就地旋转,而是

旋转到单独的垫子上

,然后将该垫子传递给我的处理函数,那么一切都会按预期进行(我在屏幕上得到一个蓝色矩形)。” >Core.rotate(frame, rotatedFrame, Core.ROTATE_90_COUNTERCLOCKWISE); processFrame(rotatedFrame);
© www.soinside.com 2019 - 2024. All rights reserved.