OpenCV中经常要进行对矩阵的操作,Mat是OpenCV中存储矩阵的类型,其包含在opencv/cv.h头文件下,其最简单的赋值操作为:
double a[] = {1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12};
cv::Mat m(3, 4, CV_64F, a);
这里建立了一个3行4列的矩阵m,元素类型为CV_64F,注意在声明其大小的时候是按照先行后列的顺序赋值,另外,a中元素的类型与矩阵元素的类型应该对应(这里都是double),否则不能正常取值。
现在的问题是,想要取得m中特定行列数的元素,应该如何操作?
OpenCV提供了at函数,可以解决该问题,使用at的方法如下:
此处的matGet2D为自定义函数,功能是根据元素类型利用at函数获取矩阵中的元素,按照上面的写法,返回值r应为矩阵m中第0行、第2列的元素:3double r = matGet2D(m, 0, 2);
<pre name="code" class="cpp">double matGet2D(cv::Mat m, int row, int col) { int type = m.type(); switch(type) { case CV_8U: return m.at<uchar>(row,col); break; case CV_8S: return m.at<schar>(row,col); break; case CV_16U: return m.at<ushort>(row,col); break; case CV_16S: return m.at<short>(row,col); break; case CV_32S: return m.at<int>(row,col); break; case CV_32F: return m.at<float>(row,col); break; case CV_64F: return m.at<double>(row,col); break; } }
经测试,r=3,符合预期。这说明at函数的参数也是按照先行后列的原则排列的。而在图像处理领域,由图片转换而来的矩阵,其x轴对应图片宽度,y轴对应图片高度,因此x对应列数,而y对应行数,利用at函数获取(x,y)点像素值时应写成at(y,x)。