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