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 | // 摘要: |
OpenCV读取该数组内存地址的像素点数据,在所有平台下,读取的顺序都是 r-g-b-a
本文链接:https://www.zoucz.com/blog/2017/06/27/unity-webcamtexture-adaptation/