Unity与openCV显示图片

关于opencv库

  • unity带了opencv库,但是这个库是based on java的基础上的,也就是说我继用过opencv的c++和python之后这回要用java了
  • OpenCV for Unity文档
  • 注意:需要在载入opecv的asset之后,把StreamingAssets文件夹移动到Asset里面,需要操作tool--set plugin settings
  • opencv自带了很多example,把这些加入到building setting里面就可以用了

显示图片

首先明确一点,unity里面显示图片没有imshow这种东西,需要把图片的mat转化成texture格式,然后把这个texture加到object上面

  • 在这里我建立了一个plane的object,并且调整了相机的角度,用来显示图片
  • 这部分在start里面进行,也就是现在的图片是静态显示

var

  • var是用来推断这个变量类型,因为var之后直接创建了变量,所以可以推断出来。但是java还是静态语言
  • 这种样子是不行的var foo; foo = "foo";
  • 在for循环里可以

imread

  • 基础功能和以前一样,读取一张图片,存为mat格式
  • 路径中使用了Application.streamingAssetsPath,也就是上文中说到需要移动到asset文件夹里的opencv自带的文件夹。
  • Imgcodecs和Imgproc等都是以前没有接触过的库,如果需要图片正常显示,需要把格式从BGR改成RGB

Texture2D

  • 这个是处理物体表面纹理的一个class,构建新的的时候需要确定这个texture的大小
  • 在这里需要创建一个新的texture2D,才能在之后把mat转到texture里面

Utils.matToTexture2D(dst, tex)

  • 用于mat和纹理的转换,同样也有texture转到mat的方法

GetComponent()

  • 得到这个gameObject的一个部分,尖括号里面的名字取决于现在这个object里面有什么
  • 这里用的是plane,里面自带renderer的属性,并且renderer里面带有material,用来修改构成这个object的材料

总结

  • 用unity显示图片的中心思想就是这个图片变成了object上面的texture,这个图片不能脱离object而独立存在,所以需要首先为这个图片构建object

最终结果如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCVForUnity;
using UnityEngine.UI;
using OpenCVForUnity.ImgcodecsModule;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.CoreModule;

public class remove : MonoBehaviour
{
void Start()
{
var dst = Imgcodecs.imread(Application.streamingAssetsPath + "/image.JPG");

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

//Debug.Log(dst.channels());
Texture2D tex = new Texture2D(dst.width(), dst.height(), TextureFormat.RGBA32, false);
OpenCVForUnity.UnityUtils.Utils.matToTexture2D(dst, tex);
gameObject.GetComponent<Renderer>().material.mainTexture = tex;

}



}