ROI 全称为Region of Interest 感兴趣的区域,为什么我们要讲这个呢?因为他在OpenCV里是一个非常重要的概念,因为给图片打水印就要用到他,你可以想象成图片上要操作的区域。比如给图片打水印,就是在图片上的一个区域,叠加上另外一个图片,就是我们统称的最粗暴的水印打法啊。下面就是我们要实现的效果啦;
首先是去把图片读取两张图片读取进来,上一篇我们已经写过把图片怎么读取啦。
我们获取到了两张图片啦!然后下面就是我们要在主图片里建立一个ROI[蒙版或者操作区域]
下面就是建立ROI的几种形式
然后我们就在图片的(0,0)的位置建立一个100X100的ROI区域,用来操作啦。
然后我们把logo尺寸缩小到100x100,大了小了都不行。也许是像素点一一对应的吧。
然后我们把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);
}