OpenCV For Unity 给图片打水印

ROI 全称为Region of Interest 感兴趣的区域,为什么我们要讲这个呢?因为他在OpenCV里是一个非常重要的概念,因为给图片打水印就要用到他,你可以想象成图片上要操作的区域。比如给图片打水印,就是在图片上的一个区域,叠加上另外一个图片,就是我们统称的最粗暴的水印打法啊。下面就是我们要实现的效果啦;


水印

首先是去把图片读取两张图片读取进来,上一篇我们已经写过把图片怎么读取啦。


我们获取到了两张图片啦!然后下面就是我们要在主图片里建立一个ROI[蒙版或者操作区域]

下面就是建立ROI的几种形式

我目前知道的四种方法

然后我们就在图片的(0,0)的位置建立一个100X100的ROI区域,用来操作啦。

然后我们把logo尺寸缩小到100x100,大了小了都不行。也许是像素点一一对应的吧。


imgproc图片处理类,进行水印缩放

    然后我们把logo拷贝给这个水印区域。


然后水印就被加好了

最后再把图片处理一下,把他转成texture2d那个RAWIMAGE就可以看到效果了。




下面是完整的代码:

public class addLogo: MonoBehaviour

{

    // Use this for initialization

    void Start()

    {

        Utils.setDebugMode(true);

        //主图片

        Mat src = Imgcodecs.imread(Application.streamingAssetsPath + "/lena.jpg");

        //logo图片

        Mat logo = Imgcodecs.imread(Application.streamingAssetsPath + "/logo.jpg");

        //

        // Imgproc.cvtColor(src,src,Imgproc.COLOR_BGR2RGB);

        // Imgproc.cvtColor(logo,logo,Imgproc.COLOR_BGR2RGB);

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

        //获取ROI的几种方式 Region of Intrest

        //1.直接根据材质建立材质

        // Mat m = new Mat(src,new Range(0,0+logo.rows()),new Range(0,0+logo.cols()));

        //2.直接调用Mat里submat方法

        // Mat m = src.submat(0,100,0,100);

        //3.直接调用Mat里submat方法

        // Mat m = src.submat(new Range(0,100),new Range(0,100));

        //4.直接调用Mat里submat方法

        Mat m = src.submat(new OpenCVForUnity.Rect(0, 0, 100, 100));

        Imgproc.resize(logo, logo, new Size(100, 100));


        logo.copyTo(m);

        Texture2D t = new Texture2D(src.width(), src.height(), TextureFormat.RGBA32, false);

        Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2RGB);

        Utils.matToTexture2D(src, t);

        this.GetComponentInChildren().texture = t;

        Utils.setDebugMode(false);

    }

你可能感兴趣的:(OpenCV For Unity 给图片打水印)