本文记录一些遇到过的Mat坑,以及易淆的知识点。
1.热身:Mat成员之易淆:
a. Mat.depth()
depth()得到的是一个0~6的数字,分别代表单个图不同的深度,对应关系如下:
+--------+----+----+----+----+------+------+------+------+
| | C1 | C2 | C3 | C4 | C(5) | C(6) | C(7) | C(8) |
+--------+----+----+----+----+------+------+------+------+
| CV_8U | 0 | 8 | 16 | 24 | 32 | 40 | 48 | 56 |
| CV_8S | 1 | 9 | 17 | 25 | 33 | 41 | 49 | 57 |
| CV_16U | 2 | 10 | 18 | 26 | 34 | 42 | 50 | 58 |
| CV_16S | 3 | 11 | 19 | 27 | 35 | 43 | 51 | 59 |
| CV_32S | 4 | 12 | 20 | 28 | 36 | 44 | 52 | 60 |
| CV_32F | 5 | 13 | 21 | 29 | 37 | 45 | 53 | 61 |
| CV_64F | 6 | 14 | 22 | 30 | 38 | 46 | 54 | 62 |
+--------+----+----+----+----+------+------+------+------+
其中:
CV_8U A.at <unsigned char>
CV_8S A.at <char>
CV_16S A.at <short>
CV_16U A.at <unsigned short>
CV_32S A.at<int>
CV_32F A.at<float>(0,1)
CV_64F A.at<double>
不可用A.at(0,0)来取深度CV_64F的矩阵值,会报错
**note:
之前写findFundamental时,调用opencv 的库,计算极线误差总是不对,最终才发现cv::findFundamentalMat返回的是CV_64F的矩阵,但我采用F.at(1,0)来获取其中的值,结果无穷大,所以得到的结果是错的。**
可以通过type()来获取矩阵类型(对应上面0-6)。
用channels()来获取通道数,如CV_32FC1的通道数为1,则返回1.
convertTo 只能转换type,不能转换通道
也就是如果一个CV_U8C1的image;
image.convertTo(newImage, CV_U8C3);
那么newImage还是CV_U8C1(CV_U8C1和CV_U8C3)
将1通道的转换成3通道的用:
cvtColor(src,dst,CV_GRAY2RGB);
将彩色图转换成灰度图用:
cvtColor(src,dst,CV_RGB2GRAY);
cvtColor用于在彩色、灰度、HSV、YCrCb等色彩空间相互转换
b.矩阵行列数目
打印 matA.size()
[3,4]
matA行为4,列为3
可以通过matA.size().width,matA.size().height得到正确行列数
c.其他常见常用函数
1. clone() 创建一个图像的深拷贝
Mat image;
image = cv::imread("boldt.jpg");
Mat cloneimage = image.clone();
2. create()函数
result.create(image.rows,image.cols,image.type());
create函数创建的图像的内存是连续的,不会对图像的行进行填补,分配的内存大小为total()*elemSize()
3. total()函数
返回Mat矩阵的像素个数
4. elemSize()函数
返回Mat矩阵每个像素的字节数