坑人的Mat
先生可曾为Mat写了一点什么没有?”我说“没有”。他就正告我,“先生还是写一点罢;如果不写,下次它可能还是会坑你“
所以我就写了这篇,以后还可能有。
Mat是什么
Mat是opencv库里的一个数据结构,作为计算机视觉领域重要的库,opencv里有很多强大的东西,用起来也很方便,但是作为其中最基础的数据结构,Mat这个东西确实令人迷惑,今天就把其中一些比较令人困惑的点简单总结下。
存储方式
Mat就是个矩阵模板,它的类型参数用一系列常数来表示了,例如常常可以看到的CV_8UC3这样的东西。所以它可以用来存储图像,单通道,多通道,或者你只想用它放一个矩阵,都可以。
但是opencv并没有Mat< double >这种东西,那怎么往里放一个想要的数据大小呢?
其实上面提到的那个代表类型的常数告诉了你答案:如CV_8UC3,第一个8代表位数,如果是32S或者64F之类的就是32位或64位,这里U可以看成uchar,如果是double,就是64位,类推之。
后面那个3或者整个C3代表的是通道数,这里3通道这个词不需要抽象的理解,就是RGB,或者3维向量,就是这么简单,如果想在一个位置就存一个数,那就C1好了。
at
说回到at,理解了上面的东西以后,at的大部分错误就清楚了——at是一个函数模板,你必须要把at的类型跟Mat的类型一样才行,因为它很坑的一点就是不去管Mat是什么类型的,或者它不会很自动的完成这一点,你必须自己知道Mat是什么类型,然后告诉它。