最近使用Mat途中遇到各种问题,结果原因出在 行列指示不清晰,所以需要好好的记录一下Mat的特别之处。
1. 可以将Mat视为封装了智能指针,也就是平常的使用,赋值都是浅赋值,没有深层的拷贝。如果需要深层的拷贝,借助函数clone(), copyTo()。 并且需要注意的是,这些Mat相当于被绑定在一块,对于某个Mat的内存修改都会影响所有的Mat。
数据类型:
CV_ [每一项的位数] [有符号或无符号] [类型前缀] C [通道数]
Mat的初始化可以有zeros(), ones(), eyes()等等函数
Mat的index是从0开始的,不是从1开始的
在OpenCV库中,图像像素坐标与所在行列数的对应关系为:x -> col, y -> row, width -> cols, height -> rows
Mat.size()返回的是(width,height)也就是(cols,rows)。
Mat的构造函数Mat(row,col,...),按顺序是正常的row,col。
Mat(Mat, Range(), Range())函数中,分别也是正常的row,col的range
cv::Mat的cols表示圖像的width,rows表示圖像的height.
cv::Range(start, end) 指的是[start,end) .,也就是总共取了end-start个,区间为 左闭右开。
rowrange与colrange用法一样。
所以Rect(x,y,width,height) 指的是 Mat矩阵index为0开始,index 是(y,x),开始的height行width列。 同样是左闭右开,与Range保持一致。
A.row(i) = A.row(j) ;/ /不起作用
/ / 这是有点儿长,但这是推荐的方法。
A.row(j).copyTo(A.row(i)) ;
Mat的一系列 加减乘除 的表达式的 等号左边 应该会修改内存吧(这点还需要进一步验证,不过应该可以,因为以前好像没有出过问题)
Opencv参数
Opencv里的函数参数InputArray支持传入std::vector,cv::Vec, cv::Scalar
Opencv里的dot应该只针对向量,因为试验了一下,两个矩阵相乘结果为一个实数。 如果是一个矩阵mat,应该会把它reshape成一个向量,然后参与运算向量的点乘
cross()是计算叉乘,两个三维向量维数应该一致,结果是一个三维向量,维数保持一致。
看到了Opencv里有个类RNG里一些随机数生成函数