OpenCV:Mat类型与数组的相互转换(16位或8位图像)

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

图像数据用数组储存的话一般是一维的,如果需要二维数组就再根据宽高转换一下就可以了。

猜你喜欢

转载自blog.csdn.net/weixin_43390123/article/details/116601232