OpenCVForUnity_识别图片像素点颜色

10 篇文章 0 订阅

OpenCVForUnity_识别图片像素点颜色

OpenCV

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

如何在Unity内使用

  1. 导入OpenCvForUnity资源包(这里使用的是2.3.3版本的资源包)
    在这里插入图片描述

  2. 导入资源包后新建Image,随便插入一张图片,同时建立一个2DGameObject,锚点设置为左下角,并随意放置在图片上任意一像素点上,该点用于确定像素点位置
    在这里插入图片描述在这里插入图片描述

  3. 新建一个测试脚本,用于使用OpenCv检测颜色
    (1)首先先截屏,因为当前是在编辑器模式下,所以使用Application.dataPath路径,该路径直接指向项目路径,打包时需要更换成Application.persistentDataPath路径下

	/// <summary>
    /// 截屏
    /// </summary>
    /// <returns></returns>
    IEnumerator ScreenShot()
    {
        yield return new WaitForEndOfFrame();

        ScreenCapture.CaptureScreenshot(Application.dataPath + "/ScreenShot/1.png");
    }

(2)获取当前像素点位置,需要注意的一点是OpenCV像素点的计算方式是从左上角开始计算

	void Start ()
    {
        Position = GetComponent<RectTransform>().anchoredPosition3D;
        Point = Vector3Topoint(new Vector3(Position.x, Camera.main.pixelHeight - Position.y, 0));
        StartCoroutine(ScreenShot());
    }

	/// <summary>
    /// 转换位置类型
    /// </summary>
    /// <param name="vector"></param>
    /// <returns></returns>
    public static Point Vector3Topoint(Vector3 vector)
    {
        return new Point(vector.x, vector.y);
    }

(3)随后使用OpenCv读取图片,并且进行获取像素点颜色操作,需要说明的一点是OpenCV使用的BGR的颜色通道,在获取颜色时需要额外注意,同时OpenCV获取像素点是以高*宽的顺序进行获取

    /// <summary>
    /// 通过OpenCV获取像素点颜色
    /// </summary>
    void CheckColorForOpencv()
    {
        var src = Imgcodecs.imread(Application.dataPath + "/ScreenShot/1.png");
        var dst = new Mat(src.cols(), src.rows(), CvType.CV_8UC4);
        Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2BGRA);

        double b = dst.get((int) Point.y, (int) Point.x)[0];
        double g = dst.get((int) Point.y, (int) Point.x)[1];
        double r = dst.get((int) Point.y, (int) Point.x)[2];
        double a = dst.get((int) Point.y, (int) Point.x)[3];

        Color = new Color((float) r / 255, (float) g / 255, (float) b / 255, (float) a / 255);
    }

(4)然后将脚本挂载在2DGameObject上,并运行测试,在面板中可以看到获取到的像素点颜色
在这里插入图片描述
在这里插入图片描述

完整代码如下

	//获取颜色
    public Color32 Color;

    //检测时间间隔
    private float CheckTIme;
    private float MaxCheckTime;

    //像素位置点
    public Point Point;
    private Vector3 Position;

	// Use this for initialization
	void Start ()
    {
        MaxCheckTime = 3.0f;
//        Point = Camera.main.WorldToScreenPoint(transform.position);

        Position = GetComponent<RectTransform>().anchoredPosition3D;
        Point = Vector3Topoint(new Vector3(Position.x, Camera.main.pixelHeight - Position.y, 0));
        StartCoroutine(ScreenShot());
    }
	
	// Update is called once per frame
	void Update ()
    {
        CheckTIme += Time.deltaTime;
        if (CheckTIme >= MaxCheckTime)
        {
            CheckColorForOpencv();
            CheckTIme = 0;
        }

    }

    /// <summary>
    /// 转换位置类型
    /// </summary>
    /// <param name="vector"></param>
    /// <returns></returns>
    public static Point Vector3Topoint(Vector3 vector)
    {
        return new Point(vector.x, vector.y);
    }

    /// <summary>
    /// 截屏
    /// </summary>
    /// <returns></returns>
    IEnumerator ScreenShot()
    {
        yield return new WaitForEndOfFrame();

        ScreenCapture.CaptureScreenshot(Application.dataPath + "/ScreenShot/1.png");
    }

    /// <summary>
    /// 通过OpenCV获取像素点颜色
    /// </summary>
    void CheckColorForOpencv()
    {
        var src = Imgcodecs.imread(Application.dataPath + "/ScreenShot/1.png");
        var dst = new Mat(src.cols(), src.rows(), CvType.CV_8UC4);
        Imgproc.cvtColor(src,dst,Imgproc.COLOR_BGR2BGRA);

        double b = dst.get((int) Point.y, (int) Point.x)[0];
        double g = dst.get((int) Point.y, (int) Point.x)[1];
        double r = dst.get((int) Point.y, (int) Point.x)[2];
        double a = dst.get((int) Point.y, (int) Point.x)[3];

        Color = new Color((float) r / 255, (float) g / 255, (float) b / 255, (float) a / 255);
    }
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值