美文网首页
OpenCV For Unity 实现简单抠图

OpenCV For Unity 实现简单抠图

作者: CodeHunter | 来源:发表于2018-05-03 14:56 被阅读0次

Opencv的抠图的思路非常简单,就是对一个像素点进行判断,如果是需要剔除的像素,就把该像素的A通道改为0,即变为透明了。

        今天就来实现下面这个效果把一个白色的透明通道,抠除的效果。

同样,要对图像操作,首先需要对图片进行读取,这是非常基本的了。而今天要获取图像上的一个像素点,那么就需要用到OpenCVForUnity这个插件中的获取像素点的方法。int[] get()

他是Mat容器上的实例方法他会返回一个Int数组,如果是JPG,这个数组的长度就是3,分别代表RGB值,如果是PNG,这个数组长度就是RGBA值。

首先我们获取图片的Mat,并把尺寸改小增加运行效率。

因为Logo是JPG,所以我们要把这个JPG装进一个四通道的容器里去。

而且我们知道图片中白色的RBA 是(255,255,255),而黑色的RBA是(0,0,0)

而我们只要判断这个像素点是不是等于255就能判断他是不是白色拉。而Mat.Put则是修改图片像素的方法,前面是图片的坐标点,后面跟着RGBA值,并保持原来的值,并把透明通道的值改为0;

但运行结果会发现锯齿很严重,抠不干净。

而我们也知道图片的像素其实是做了插值运算的,所以越是邻近黑色的像素点,并不等于255的。所以我们把他设置一个阈值。

你会发现比刚才干净很多。

但复杂抠图可比简单抠图要难很多,逻辑也要复杂很多,所以这里只是提供一个思路给大家,如何去改变一个像素值,获取一个像素值,你可以自己不断进行新的尝试。


下面是完整代码

void Start()

    {

        //把图片读进三通道的容器

        var src = Imgcodecs.imread(Application.streamingAssetsPath + "/logo.jpg", 1);

        // var mask  = Imgcodecs.imread(Application.streamingAssetsPath+"/testsf.jpg",0);

        //把尺寸设置为大小

        Imgproc.resize(src, src, new Size(500, 500));

        //建立一个四通道的容器

        var dst = new Mat(src.cols(), src.rows(), CvType.CV_8UC4);

        //转换色彩空间

        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2RGBA);

        for (int i = 0; i < dst.cols(); i++)

        {

            for (int j = 0; j < dst.rows(); j++)

            {

                //这个105是阈值,你可以自己定义来试试效果

                if (dst.get(j, i)[0] >105)

                {

                    dst.put(j, i, 255, 255, 255, 0);

                }

            }

        }

        var tex = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGBA32, false);

        Utils.matToTexture2D(dst, tex);

        var raw = this.GetComponentInChildren();

        raw.texture = tex;

        raw.SetNativeSize();

    }

相关文章

  • OpenCV For Unity 实现简单抠图

    Opencv的抠图的思路非常简单,就是对一个像素点进行判断,如果是需要剔除的像素,就把该像素的A通道改为0,即变为...

  • Swift图片处理

    本文源码在Github: *** 简单图片背景替换(实现抠图效果) 参考:http://blog.csdn.net...

  • OpenCV For Unity 实现简单的图片修复

    最近真的很久没更新OpenCV的东西啦,一方面工作有点小忙,最近没时间研究;另一方面这方面的资料真的很难找,好在最...

  • Android OpenGL ES(八) - 简单实现绿幕抠图

    实现绿幕抠图,其实想法很简单。这里简单粗暴的使用着色器替换。 OES Filter 直接实现在相机预览上的Shad...

  • Opencv 提取ROI 抠图

    OPencv中有很多算法可以提供我们提取ROI,话不多说效果如下图。 弱弱的问一句,提取ROI以后,怎么把背景变透...

  • iOS 图片处理

    iOS开发-简单图片背景替换(实现抠图效果) iOS8 Core Image In Swift:自动改善图像以及内...

  • Opencv实现简单的人脸检测

    使用Opencv实现一个简单的人脸检测的Demo,是很简单的,具体的算法都是Opencv内部实现的,我们只需要调用...

  • 09_connect_with_openCV

    search for openCV for unity import using namespace using ...

  • #作业#04第一周作业锦囊12@易效能PPT13期

    #PPT90天践行第1练#20170718 PPT01布尔运算如何实现图片的任意抠图 步骤:①形状曲线抠图;②选图...

  • PS各种抠抠抠

    PS抠图在设计中有是很基础的操作,今天就简单记录一下我学习中学到的集中抠图方式 1、选框工具抠图 用选框工具,快速...

网友评论

      本文标题:OpenCV For Unity 实现简单抠图

      本文链接:https://www.haomeiwen.com/subject/renkrftx.html