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;yfor(int x=0;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显示的图像有问题,不知道问什么???

你可能感兴趣的:(mfc,框架,存储)