Opencv Mat使用

最近使用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里一些随机数生成函数

你可能感兴趣的:(Opencv Mat使用)