StretchDIBits 函数
由于OpenCV位图结构中的像素数据与DIB中的像素具有类似的存储结构,可以考虑直接用来在视图窗口中显示。知道位图像素的存放地址直接往视图窗口显示的函数虽然不多,但还是有Windows API中的StretchDIBits函数可以利用,由下面列出的StretchDIBits函数原型中可知,只要为它构造一个DIB的位图信息就行了。
int StretchDIBits( HDC hdc, // 显示设备句柄 int XDest, YDest, nDestWidth, nDestHeight, // 目标矩形区域参数 int XSrc, YSrc, nSrcWidth, nSrcHeight, // 源矩形区域参数 // 源区域与目标区域参数相同时为 1:1 比例显示 CONST VOID *lpBits, // 位图的像素存放首地址 CONST BITMAPINFO *lpBitsInfo, // 位图信息存放地址 UINT iUsage, // 位图中的颜色类型,RGB模式用DIB_RGB_COLORS DWORD dwRop // 像素操作码,简单复制用SRCCOPY );
为此,演示程序CCVMFC中增加了3个函数,即CtreateMapInfo、imageClone与imageReplace。其中,CtreateMapInfo 函数用于建立OpenCV位图的位图信息,其特点是可以为单通道位图设置黑白灰阶调色板。ImageClone函数使用OpenCV函数实现位图的复制,自动释放老的指针所指向的存储单元以防止内存泄漏,同时返回的m_dibFlag标志可以用于激发刷新工作位图workImg的位图信息m_lpBmi (见后面说明)。imageReplace与ImageClone相似,但不建立新位图,只用输入位图替换输出位图。
LPBITMAPINFO CtreateMapInfo(IplImage* workImg) // 建立位图信息 { BITMAPINFOHEADER BIH={40,1,1,1,8,0,0,0,0,0,0}; LPBITMAPINFO lpBmi; int wid, hei, bits, colors,i; RGBQUAD ColorTab[256]; wid =workImg->width; hei =workImg->height; bits=workImg->depth*workImg->nChannels; if (bits>8) colors=0; else colors=1<<bits; lpBmi=(LPBITMAPINFO) malloc(40+4*colors); BIH.biWidth =wid; BIH.biHeight =hei; BIH.biBitCount=(BYTE) bits; memcpy(lpBmi,&BIH,40); // 复制位图信息头 if (bits==8) { // 256 色位图 for (i=0;i<256;i++) { // 设置灰阶调色板 ColorTab[i].rgbRed=ColorTab[i].rgbGreen=ColorTab[i].rgbBlue=(BYTE) i; } memcpy(lpBmi->bmiColors, ColorTab, 1024); } return(lpBmi); } int imageClone(IplImage* pi, IplImage** ppo) // 复制 IplImage 位图 (OpenCV) { if (*ppo) cvReleaseImage(ppo); // 释放原来位图 (*ppo) = cvCloneImage(pi); // 复制新位图 return(true); }
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-30453-2.html
这是我的老公们