找回密码
 立即注册
查看: 662|回复: 0

OPENCV FOR UNITY 插件研究(一)

[复制链接]
发表于 2020-12-1 14:56 | 显示全部楼层 |阅读模式
最近因为项目需求,研究unity for opencv 以及Dlib FaceLandMark Detecor(需要opencvde 扣脸插件)的插件。所以写些文档,以备自己查看,也可以分享。
unity for opencv 插件的基本配置方法,商店有视频可以自己看。


重点是:一定要记得把OpenCVForUnity文件夹下的StreamingAssets拖到unity跟目录下。
那个里面保存了测试场景需要用到的图片和其他文件。(顺带一提StreamingAssets是unity默认的全平台都能读取到文件的路径)
然后记得点一下顶上方,菜单窗口里面的Tool选单。里面OPEN CV FOR UNITY 里面的
set Plugin import setting
Dlib 的设置操作是一样的同上。


这个是这个插件的附带的文档。本人粗看一脸蒙蔽。完全不知道从哪里入手。
OpenCV for Unity: Main Page


然后自己左右上下摸索了一天后。发现其实正确的姿势应该是从opencv 官方文档入手。
一开始使用这个插件的时候,以为这个插件应该用的opencv 对于C#支持的版本。
但是进底层查看了一下,发现它调用的还是OPENCV C++的Dll
也就是说,opencv C++ 有哪些接口,基本上它都能用。所以直接参考OPENCV官方文档可能是最好的使用方式。


这是opencv论坛上的资料,可能比看书要高效很多吧。
OpenCV 教程 - OpenCV 2.3.2 documentation
基本上你需要什么函数,只要在工程里面搜索这个函数,就能找到。
就是函数可能没有把重构写全,还有就是模块名字可能有改变。


想在unity里面使用OPENCV。第一关还是要知道什么是MAT
怎么获取把unity的图片给opencv处理。
如果你连MAT是什么都不知道,那你至少需要去科普一下opencv。
如果你已经知道mat是什么了。那么我们怎么把图片变成mat处理呢。
这个插件写了一个静态工具类Utils
静态类名:OpenCVForUnity.Utils
这个类处理还是有各种不智能的,比如说长宽必须一模一样。
还有CvType是什么下面这个文档讲的蛮清楚的。
OpenCv学习笔记(二)--Mat矩阵(图像容器)的创建及CV_8UC1,CV_8UC2等参数详解 - maweifei的博客 - CSDN博客
对于CV_8UC3 为什么表示8bit无符号整形3通道看上面的链接。




这是图片如何显示在unity贴图上的方法。


使用的时候需要注意的是,长宽一定要一样大。然后贴图格式一定要比mat大。比如RGBA32表示的是一个像素32位,4通道。那么mat不能使64bit的。但颜色通道可以少。


然后它写的工具类个人感觉还是挺少的。
经常需要把Vector3转point。所以个人建议在unity工具类里面实现一个这样的互转换方法。或者自己写一个适配器类。
自己写的一个互转的方法。方便使用。
/// <summary>
        /// 将Vector2转point
        /// </summary>
        /// <param name="vector"></param>
        /// <returns></returns>
        public static Point Vector2Topoint(Vector2 vector)
        {
            return new Point(vector.x, vector.y);
        }


        /// <summary>
        /// point强转vector2
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public static Vector2 PointToVector2(Point p)
        {
            return new Vector2((float)p.x, (float)p.y);
        }

        /// <summary>
        /// 将vector数组转point
        /// </summary>
        /// <param name="vector"></param>
        /// <returns></returns>
        public static Point[] Vector2STopointS(Vector2[] vector)
        {
            Point[] out_p = new Point[vector.Length];
            for (int i = 0; i < out_p.Length; i++)
            {
                out_p = Vector2Topoint(vector);
            }
            return out_p;
        }




余下的研究会继续更新。目前想做的是用unity做换脸的小游戏。进展还算不错的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 01:07 , Processed in 0.104677 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表