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数组来表示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 摘要: 
// 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

☞ 参与评论