大恒相机sdk开发+opencv开发笔记七 工业相机转换成Mat 类型
一 .Mat类型 Mat基本上是一个具有两个数据部分的类:矩阵头(包含矩阵的大小,用于存储的方法,存储在哪个地址的信息等等)和指向包含像素值(取决于所选存储方法的任何维度)。矩阵头大小是恒定的,然而矩阵本身的大小可以随着图像的不同而变化,通常会大一个数量级。
OpenCV是一个图像处理库。它包含大量的图像处理功能。为了解决计算挑战,大多数时候你最终会使用库的多个功能。因此,将图像传递给功能是常见的做法。我们不应该忘记,我们正在谈论的图像处理算法,这往往是相当计算重。我们想要做的最后一件事是通过制作不必要的可能的大图像副本进一步降低程序的速度。
为解决这个问题,OpenCV使用引用计数系统。这个想法是每个Mat对象都有自己的头,但是通过使它们的矩阵指针指向相同的地址,矩阵可以在它们的两个实例之间共享。此外,复制操作符只会将头和指针复制到大矩阵,而不是数据本身。 二 相机数据转换成Mat类型 为什么要把相机转换成Mat类,相机拍摄图片当时在内存中opencv不能直接对其进行处理,在opencv2之后Mat类型便成为了图像的基本容器,我们这里需要对其进行转换,而之前相机图片的类型为Bayer类型数据 这里我们要先定义一个Mat类型的数据 其实转换的过程并没有什么难的,其实和两个杯子相互交换水源一样,我们只需要将数据进行拷贝,这里我们需要一个函数memcpy 3.memcpy memcpy指的是C和C++使用的内存拷贝函数,函数原型为void *memcpy(void *destin, void *source, unsigned n);函数的功能是从源内存地址的起始位置开始拷贝若干个字节到目标内存地址中,即从源source中拷贝n个字节到目标destin中。 实例程序:
memcpy(test.data, m_pBufferRGB, m_nImageWidth*m_nImageHeight * 3);
imwrite("./test1.bmp", test);
namedWindow("test");
imshow("test", test);
waitKey(15);
注意:图像都是三通道的数据所以需要行数乘以列数在乘以三。
|