对OpenCV中矩阵Mat的小分析

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);
double matGet2D(cv::Mat m, int row, int col)
{
    int type = m.type();
    switch(type)
    {
        case CV_8U:
            return m.at(row,col);
            break;
        case CV_8S:
            return m.at(row,col);
            break;
        case CV_16U:
            return m.at(row,col);
            break;
        case CV_16S:
            return m.at(row,col);
            break;
        case CV_32S:
            return m.at(row,col);
            break;
        case CV_32F:
            return m.at(row,col);
            break;
        case CV_64F:
            return m.at(row,col);
            break;
    }
}


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

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

你可能感兴趣的:(对OpenCV中矩阵Mat的小分析)