将相机预览旋转到Portrait Android OpenCV Camera和Xamarin

时间:2016-10-03 09:40:02

标签: android opencv xamarin

有没有人使用过包装的Xamrin版本? https://components.xamarin.com/view/emgucv-v3

我最近购买了此许可证,并且遇到了与此处所述完全相同的问题(Rotate camera preview to Portrait Android OpenCV Camera)。一直在使用各种方法。

首先将屏幕方向从横向旋转到纵向,但这只是以相同的旋转形式(90度)显示流。景观似乎是唯一可以按照我的意愿运作的景观。

我曾尝试使用相机对象旋转相机本身,但这也无法解决问题。即。

camera.SetDisplayOrientation(90);

我已经多次调查这一点,看看执行的位置,看起来最初屏幕设置正确,但是到时候

protected override void OnDraw(Android.Graphics.Canvas canvas)
运行

以添加它已将其翻转的FPS文本。

我还尝试使用Matrix翻转图像,但这会将帧速率从大约20FPS降低到大约6FPS。这太过分了。一击

真的在这里挣扎,因为现在这是构建我的应用程序的主要障碍。

我对Xamarin来说相当新,所以非常感谢任何帮助。

P.S。道歉。我知道这已经被另一个线程(Rotate camera preview to Portrait Android OpenCV Camera)覆盖了,我已经尝试了所有选项,但是这个条目被Ed Cotrell(Admin)从该线程删除了,我被告知要开始一个新的。

1 个答案:

答案 0 :(得分:1)

好的,所以我想我明白了!

看来Xamarin中的OpenCV示例使用来自缓冲区的原始流,默认情况下,它以90度角进入,无论您使用UI布局或摄像机设置/参数的方向如何。

所以,我在ProcessedCameraPreview中重写了代码

protected override void OnDraw(Android.Graphics.Canvas canvas)

最初我将下面的图像对象转换为原生的Android位图并旋转它。表现受到了巨大打击。

Image<Bgr, byte> image = _bgrBuffers.GetBuffer(0);

所以,我想出是否做了以下事情: -

Image<Bgr, byte> rotateImage = image.Rotate(90, new Bgr(System.Drawing.Color.Black));
canvas.DrawBitmap(rotateImage.ToBitmap(), 0, 0, _paint);

它将按照90度角的要求进行渲染。性能影响并不明显。

我现在拥有执行我想要使用的OpenCV函数所需的图像对象。

P.S。值得注意的另一个选择是使用以下方法旋转画布: -

Matrix matrix = new graphics.Matrix();
matrix.PostRotate(90);
DrawBitmap(image.ToBitmap(), matrix, _paint);

性能影响再次不明显。