背景:
在使用OpenCV C++包时,通常需要访问和修改cv::Mat的数据值。要做到点对点的处理,保证程序的正确性,需要先确定cv::Mat的数据类型type,以确定后续访问cv::Mat数据的调用接口。
做法:
要确定cv::Mat的数据格式,最直接的做法是调用type API,得到type的输出值。
cv::Mat img;
/*
...
image processing
some data written into 'img'
...
*/
std::cout << img.type() << std::endl;
我们会得到一些type的整型值,可以通过查表来对应得到数值类型。
搬运表格:
+--------+----+----+----+----+------+------+------+------+
| | 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 |
+--------+----+----+----+----+------+------+------+------+
直接查表更方便~
要逐个访问Mat的元素,则可以根据Mat的类型,用对应的API,例如img.at<float>/img.at<Vec3b>,来逐一访问。