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

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/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球