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 时子垫不与其父项共享缓冲区?
我想通了这个问题。该代码在循环中运行(因为从相机接收到每一帧),而不仅仅是一次。子垫仅在循环中第一次创建,因为它应该共享父级的缓冲区,因此当父级使用相机的下一帧更新时,它应该得到更新。问题是我在将相机的框架传递到我的处理函数之前将其旋转到位:
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)
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |