对OpenCV中矩阵Mat的小分析

来源:互联网 发布:mac沙盒游戏 编辑:程序博客网 时间:2024/04/28 12:26

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的方法如下:

double 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;    }}


此处的matGet2D为自定义函数,功能是根据元素类型利用at函数获取矩阵中的元素,按照上面的写法,返回值r应为矩阵m中第0行、第2列的元素:3

经测试,r=3,符合预期。这说明at函数的参数也是按照先行后列的原则排列的。而在图像处理领域,由图片转换而来的矩阵,其x轴对应图片宽度,y轴对应图片高度,因此x对应列数,而y对应行数,利用at函数获取(x,y)点像素值时应写成at(y,x)。

0 0
原创粉丝点击