1.通过数组生成Mat
有时我们在工程中会接受数组类型的图像,处理起来不太方便,如果将它转化成Mat类型就可以使用opencv庞大的函数库了。对此,Mat本身提供了很方便的构造函数:
//已有数组ImgData
unsigned short* ImgData;
//转化成Mat
Mat image(height, width, CV_16UC1, ImgData);
是不是非常简单,一句话就出来了,但有两个点需要特别注意:
1.数组ImgData可以是一维数组也可以是二维数组,直接放进来就行。
2.第三个参数CV_16UC1一定要根据自己的数组类型写对!!!这串字符构成是这样的:
CV_[位数][带符号与否][类型前缀]C[通道数]
我的数组是16位的ushort类型,写16U;如果是uchar就要写8U。一般写不对也会报错的,但切记不要对数组进行强制类型转化,可能编译器暂时不会报错,但后续用这个Mat的时候就会出现一些奇奇怪怪的问题。
最后,我的数据是灰度图像,所以通道数写1,彩色图像我没有试过,不知道这样能不能行。
2.Mat转化成数组
mat.data是uchar类型,需要得到八位的数据可以直接转换,如果需要十六位的数据可以使用指针。
//转8位一维数组
uchar *array = new unsigned char[mat.rows*mat.cols];
if (mat.isContinuous())
array = mat.data;
//转16位一维数组
imageData = new unsigned short[mat.rows*mat.cols];
for (int i = 0; i < mat.rows; i++)
{
ushort* idata = mat.ptr<ushort>(i);
for (int j = 0; j < cols; j++)
{
imageData[i*rows + j] = idata[j];
}
}
图像数据用数组储存的话一般是一维的,如果需要二维数组就再根据宽高转换一下就可以了。