cximage and opencv

前一段时间用的opecv比较多,是一个不错的软件包,然后cximage 和opecv的图像库都差不错,我使用cximage的原因是因为这个图像库有MFC框架,而这个框架很方便,如何在这个框架中使用opencv和cximage这两个图像库是个很难的问题,

开始的时候不知道数据显示,后来才明白cximage图像的数据时从下到上,从左到右,而opecv里的Mat数据类型是从下到上,从左到右的存储,使用的时候需要转换

CxImage::CXIMAGEINFO tmpinfo;//每个像素的数值排列方式是BGR,而不是常说的RGB,这个opencv中使用的结构是一样的,都是使用的是BGR顺序
tmpinfo=(tmp).info;


cv::Mat cvimg;//=cv::imread("d:\\1.jpg",1);
cvimg.create(head.biHeight,head.biWidth,CV_8UC3);

for(int y=0;y<head.biHeight;y++)//cximageimage data convert to opencv data
for(int x=0;x<head.biWidth;x++)
{
*(cvimg.data+(x+y*head.biWidth)*3)=*(tmpinfo.pImage+(x*3+(head.biHeight-y-1)*tmpinfo.dwEffWidth));
*(cvimg.data+(x+y*head.biWidth)*3+1)=*(tmpinfo.pImage+(x*3+(head.biHeight-y-1)*tmpinfo.dwEffWidth)+1);
*(cvimg.data+(x+y*head.biWidth)*3+2)=*(tmpinfo.pImage+(x*3+(head.biHeight-y-1)*tmpinfo.dwEffWidth)+2);
}

dwEffWidth这个数据很关键,位图bmp的宽度,计算公式如下:dwEffWidth=(3*图像宽度+未知数x)/4  ,这个结果必须是四的整数倍。所以必须求未知数x

还有一种方法是直接的内存拷贝,内存拷贝使用memcpy函数,如果不按dwEffWidth进行访问图的数据,用MFC下的DC显示的图像有问题,不知道问什么???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值