1.通过数组生成Mat
有时我们在工程中会接受数组类型的图像,处理起来不太方便,如果将它转化成Mat类型就可以使用opencv庞大的函数库了。对此,Mat本身提供了很方便的构造函数:
unsigned short* ImgData;
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类型,需要得到八位的数据可以直接转换,如果需要十六位的数据可以使用指针。
uchar *array = new unsigned char[mat.rows*mat.cols];
if (mat.isContinuous())
array = mat.data;
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];
}
}
图像数据用数组储存的话一般是一维的,如果需要二维数组就再根据宽高转换一下就可以了。
Original: https://blog.csdn.net/weixin_43390123/article/details/116601232
Author: 我本是机械人
Title: OpenCV:Mat类型与数组的相互转换(16位或8位图像)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/702753/
转载文章受原作者版权保护。转载请注明原作者出处!