From: http://blog.csdn.net/u010417185/article/details/53114452
1 2 |
//对于一个数据类型为type的Mat a来说 type temp = a.at(x,y); |
1 |
当采用这种方法取元素值得时候,type成为一个麻烦的问题,因为一般我们生成Mat的时候,都是这样的:
1 2 |
Mat a; a.create(Size(x,y), CV_8UC1); |
而取元素值时不能写成”a.at(x,y)”或者”a.at<a.type()>(x,y)”。
所以这里列出OpenCV中定义的型别和C++中型别的对应关系,
CV_8SC1 -> char
CV_8UC1 -> unsigned char
CV_16SC1 -> short
CV_16UC1 -> unsigned short
CV_32SC1 -> int
CV_32FC1 -> float
CV_64FC1 -> double
OpenCv中的数据型别命名规则为:CV_(比特数)+(数据类型)+(Channel数),我们也可以直接根据命名规则得到相应的数据型别。
下面举例:
1 2 |
<span style="font-size: 14px;">CV_16UC1类型的数据,访问像素(i,j) img.at(i,j)即可。</span> |
若不知道所属的属性,则可以通过转变数据类型进行获取值。本人一般喜欢转为double型,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Mat dta;//位置其数据类型 Mat data = cv::Mat_(_data);//数据类型转换为double int N = data.rows; int D = data.cols; /// mean Mat m = Mat::zeros(1, D, data.type());//如果想新建一个相同数据类型的数组,使用type()即可 for (int j = 0; j<D; j++) { for (int i = 0; i<N; i++) { m.at(0, j) += data.at(i, j); } } |
对于保存图片的Mat来说,下面给出读取Mat中数据的例子:
1 2 3 4 5 6 7 8 |
<span style="font-size: 12px;">//对于单通道图像 //0表示读取的灰度图像(彩色图像将转换成灰度图像) Mat image_C1 = imread ( "lena.jpg", 0 ); uchar elem = image_C1.at( x, y ); //对于彩色图像 Mat image_C3 = imread ( "lena.jpg" ); Vec3b elem_3 = image_C3.at(x,y); //里面包含三个元素:elem_3.val[0]、elem_3.val[1]、elem_3.val[2] </span> |