将相机预览旋转到人像 Android OpenCV 相机和 Xamarin

Posted

技术标签:

【中文标题】将相机预览旋转到人像 Android OpenCV 相机和 Xamarin【英文标题】:Rotate camera preview to Portrait Android OpenCV Camera and Xamarin 【发布时间】:2017-02-11 05:20:11 【问题描述】:

有人用过打包的 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 的新手,非常感谢任何帮助。

附:道歉。我知道这已被另一个线程 (Rotate camera preview to Portrait Android OpenCV Camera) 覆盖,并且我已经尝试了那里的所有选项,但是 Ed Cotrell(管理员)从该线程中删除了该条目,并被告知要开始一个新的。

【问题讨论】:

【参考方案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 功能所需的图像对象。

附:另一个值得注意的选项是使用旋转画布:-

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

再次对性能的影响并不明显。

【讨论】:

以上是关于将相机预览旋转到人像 Android OpenCV 相机和 Xamarin的主要内容,如果未能解决你的问题,请参考以下文章

Android相机预览人像比例

如何在surfaceview中将Android相机更改为人像?

Android:编码的相机预览帧总是横向的。如何旋转?

OpenCV for Android:使用 Imgproc.cvtColor 将相机预览从 YUV 转换为 RGB

相机预览人像设置参数失败

为啥Android模拟器中的相机预览会旋转90度?