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

本文详细介绍了如何将通过相机获取的unsigned char*或BYTE*图像数据转换为OpenCV中的Mat类型,针对图像宽度是否满足BMP格式要求的两种情况进行了说明。通过自定义的读取BMP图像程序,根据图像宽度计算格式宽度,并使用Mat构造函数进行封装,以方便进行后续的图像处理或计算机视觉任务。
摘要由CSDN通过智能技术生成

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

环境:vs2008 + opencv2.4.6

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

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

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

1.程序

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.

2.

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

1.程序

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

2.结果

注意:

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值