如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型

来源:互联网 发布:云警报警主机编程 编辑:程序博客网 时间:2024/05/22 22:08

如何将unsigned char*(或BYTE*)图像数据封装成OpenCV中Mat类型

环境:vs2008 + opencv2.4.6

根据待封装图像数据的宽度,封装方法有两种。

下面以封装单通道、8位灰度BMP图像为例进行说明,其中读BMP图像程序是自己开发的。

第一种情况:图像宽度满足4的倍数,即满足BMP格式宽度要求。


RdWtIm rdWtIm;int width = 0;int height = 0;int lineByte = 0;BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height);lineByte = (width + 3)/4*4; //格式宽度printf("width = %d\n", width);printf("height = %d\n", height);printf("lineByte = %d\n", lineByte);Mat iMat(height, width, CV_8UC1, imData, lineByte);namedWindow("lena");imshow("lena", iMat);

其中,imData的尺寸是width*height,因我的Read8bitbmp读取的是有效数据;此时,width == lineByte.



第二种情况:图像宽度不满足BMP格式宽度时

RdWtIm rdWtIm;int width = 0;int height = 0;int lineByte = 0;BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height);lineByte = (width + 3)/4*4; //格式宽度printf("width = %d\n", width);printf("height = %d\n", height);printf("lineByte = %d\n", lineByte);Mat iMat(height, width, CV_8UC1, imData, width);namedWindow("lena");imshow("lena", iMat);

其中,imData的尺寸是width*height,因我的Read8bitbmp读取的是有效数据;此时,width<lineByte.
2.结果



注意:

1.上述程序只是为了验证如何将相机传输来的内存数据封装成Mat,以便利用opencv来进行图像处理或计算机视觉开发;

2.如果数据已经保存为图像文件,完全可以使用opencv自带的读图像函数imread。

3.如果利用c/c++自己开发读bmp图像,可以考虑返回的即是格式宽度的图像数据,这样封装的时候一直使用lineByte就可以。

4.可以参考我读写BMP图像程序。

http://blog.csdn.net/lyc_daniel/article/details/9193793


0 0
原创粉丝点击