Unity3D WebCamTexture 取帧渲染、像素读取的终端适配

导语

Unity3D可以通过WebCamTexture获取摄像头的像素数据,用于渲染到纹理或者图像相关计算。 由于Win/Mac/Adnroid/iOS等各系统平台和硬件环境下,WebCamTexture 用于渲染和图像计算时表现不完全一致,很容易造成图像渲染或者计算不正确,给调试带来很大麻烦,所以在这里总结一下。

Unity3D可以通过WebCamTexture获取摄像头的像素数据,用于渲染到纹理或者图像相关计算。

由于Win/Mac/Adnroid/iOS等各系统平台和硬件环境下,WebCamTexture 用于渲染和图像计算时表现不完全一致,很容易造成图像渲染或者计算不正确,给调试带来很大麻烦,所以在这里总结一下。

纹理渲染和OpenCV图像计算的像素坐标系

用一张3*3像素的图片来表示,Unity3D纹理渲染像素顺序如下:

7

8

9

4

5

6

1

2

3

左下角为原点,向上和向右为正方向排布像素点

OpenCV进行图像计算的时候,像素顺序如下:

1

2

3

4

5

6

7

8

9

左上角为原点,向下和向右为正方向

WebCamTexture 在各平台下的表现

Windows

渲染时像素顺序:

7

8

9

4

5

6

1

2

3

获取的像素点数组排布顺序:

7

8

9

4

5

6

1

2

3

OpenCV读入像素计算时,将图像在y方向上翻转就可以了

Android 后置摄像头

同Windows

Android 前置摄像头

同Windows

但是此处有一点要注意的是,前置摄像头需要的实际上是左右调换的镜面成像,所以实际上需要的像素点排布顺序是:

9

8

7

6

5

4

3

2

1

在纹理渲染和图像计算时,最好是同时做一个x方向上的翻转,以得到上边的像素点顺序

iOS后置摄像头

iOS后置摄像头获取的像素顺序与OpenCV计算时的顺序一致,若直接渲染会上下颠倒。

其像素点排布顺序是:

1

2

3

4

5

6

7

8

9

所以在使用iOS后置摄像头获取帧并渲染时,应注意在y方向上对图像做翻转

iOS前置摄像头

iOS前置摄像头获取的像素点排布顺序是:

9

8

7

6

5

4

3

2

1

渲染时可不对图像做任何处理,这就是前置摄像头需要的左右镜面效果

OpenCV读取时,按照与Windwos一致的读取方式,将图像读取为

3

2

1

6

5

4

9

8

7

即可

rbga读取顺序

从WebCamTexture 中获取的像素点用Color32数组来表示

    // 摘要: 
    //     Representation of RGBA colors in 32 bit format.
    [IL2CPPStructAlignment(Align = 4)]
    [UsedByNativeCode]
    public struct Color32
    {
        // 摘要: 
        //     Alpha component of the color.
        public byte a;
        //
        // 摘要: 
        //     Blue component of the color.
        public byte b;
        //
        // 摘要: 
        //     Green component of the color.
        public byte g;
        //
        // 摘要: 
        //     Red component of the color.
        public byte r;

        //
        // 摘要: 
        //     Constructs a new Color32 with given r, g, b, a components.
        //
        // 参数: 
        //   r:
        //
        //   g:
        //
        //   b:
        //
        //   a:
        public Color32(byte r, byte g, byte b, byte a);
    }

OpenCV读取该数组内存地址的像素点数据,在所有平台下,读取的顺序都是 r-g-b-a

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏深度学习那些事儿

深度学习-TF、keras两种padding方式:vaild和same

在使用Keras的时候会遇到这样的代码x = Conv2D(filters, kernel_size=5, strides=2, padding='same')...

1715
来自专栏钱塘大数据

看完这些美如画的数据信息图,你还会用饼图做图表?

1003
来自专栏量化投资与机器学习

深度学习Matlab工具箱代码注释之cnnapplygrads.m

%%========================================================================= %...

17510
来自专栏菩提树下的杨过

机器学习笔记(2):线性回归-使用gluon

代码来自:https://zh.gluon.ai/chapter_supervised-learning/linear-regression-gluon.htm...

553
来自专栏专知

【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch

【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视...

6517
来自专栏大数据挖掘DT机器学习

【OCR技术】大批量构造中文文字训练集

放假了,终于可以继续可以静下心写一写OCR方面的东西。上次谈到文字的切割,今天打算总结一下我们怎么得到用于训练的文字数据集。如果是想训练一个手写体识别的模型,用...

6274
来自专栏瓜大三哥

基于FPGA的Canny算子设计(二)

滞后阈值分割电路设计 滞后阈值需要两个阈值:一种方法是可以根据所要提取的图片,提前定好这两个阈值;另一种方式是采用自动阈值法(如大律法)。这里采用第一种方法。 ...

1936
来自专栏CNN

MobileNet原理+手写python代码实现MobileNet

MobileNet是针对移动端优化的卷积,所以当需要压缩模型时,可以考虑使用MobileNet替换卷积。下面我们开始学习MobileNet原理,并且先通过Ten...

622
来自专栏小鹏的专栏

tensorflow使用BN—Batch Normalization

注意:不要随便加BN,有些问题加了后会导致loss变大。 上一篇是 Batch Normalization的原理介绍,看一下tf的实现,加到卷积后面和全连接层...

4297
来自专栏生信技能树

lncRNA实战项目-第六步-WGCNA相关性分析

WGCNA将lncRNA分成18个模块(3635个lncRNA),空间模块中lncRNA表达呈现明显的组织区域特异性,如:CB (M1, 794个lncRNAs...

89510

扫码关注云+社区