博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DirectShow OpenCV GDI+ 图形显示格式转换
阅读量:5742 次
发布时间:2019-06-18

本文共 1814 字,大约阅读时间需要 6 分钟。

DirectShow OpenCV GDI+ 图形显示格式转换

GDI+在显示图像方面要比GDI使用起来更方便

OpenCV图像处理方面无论深度和与VC的兼容性方面都是很好的,

DirectShow要视频采集方面目前应该说是最优秀的

但OpenCV的IplImage格式与GDI+所需要的BITMAPINFO稍有不同

同时OpenCV集成的视频捕捉部分采用的VFW,效率上远不如DirectShow

三者之间的图像转换工作我采用的如下方法,经测试效率还可以

测试架构为
1.DirectShow采集一帧图像到源内存buf,把此buf转为OpenCV的彩色IplImage格式
2.用OpenCV的方法转成灰度图得到一个新的灰度IplImage
3.把灰度IplImage转为GDI+所能识别的Bitmap,显示到指定DC中
以上所有过程没有对源内存buf的无效copy过程(当然转灰度图过程OpenCV是要建个Buf的,不可省的)

1.DirectShow采集一帧图像到源内存buf,在CB函数中..

STDMETHODIMP CSampleGrabberCB::BufferCB(double SampleTime, BYTE * pBuffer, long BufferSize )
{
//cvCreateImage opencv自带函数,建立一个空图
IplImage *pImg = cvCreateImage(cvSize(biWidth ,biHeight), 8, 3);//建立空图3*8=24位
pImg->imageData = (char*)pBuffer;//得到buf指针,图像创建完毕
::SendMessageW(m_hWnd, UM_DVBACK, 0, LPARAM(pImg));//把图发到主线程,转2
cvReleaseImage(&pImg);//释放图
return 0;
}

2.在主线程中消息响应函数中用OpenCV的方法转成灰度图得到一个新的灰度IplImage

LRESULT CMy05_ThreadSnapDlg::OnUMDVBACK(WPARAM wParam, LPARAM lParam)
{
IplImage *pImgSrc = (IplImage *)lParam;// 得到源图  
IplImage* pImgGray = cvCreateImage(cvGetSize(pImgSrc), 8, 1);// 建立新的空的灰度图
cvCvtColor(pImgSrc, pImgGray, CV_BGR2GRAY);// 24位RGB彩图转灰度图,opencv自带函数,这里可以使用任何opencv函数进行图象处理
DrawImgToHwnd(m_hWnd, pImgGray); //自写函数,显示灰度图,即处理结果;转3
}

3.把灰度IplImage转为GDI+所能识别的Bitmap,显示到指定DC中

void CMy05_ThreadSnapDlg::DrawImgToHwnd(HWND hWnd, IplImage *pImg)
{
int nBitCount = (pImg->depth & 255) * pImg->nChannels;//图像色彩深度 opencv源码这样写的,也可以直接乘
int nWidth = pImg->width;
int nHeight = pImg->height;//这里特别注意,如果发现倒像,这里设为负值即可(-pImg->height)
BITMAPINFO *pBITMAPINFO = nBitCount == 24 ? m_pBITMAPINFO_24:m_pBITMAPINFO_08;
//24位图和8位图的BITMAPINFO是固定的,要提前创建好,一次即可
Bitmap* pBitmap = Bitmap::FromBITMAPINFO(pBITMAPINFO, pImg->imageData);//GDI+的图像格式
Graphics *gdiDC = Graphics::FromHWND(hWnd);//GDI+创建画板方法
gdiDC->DrawImage(pBitmap,0,0);//GDI+画图方法
delete pBitmap;
delete gdiDC;
}

转载地址:http://ssizx.baihongyu.com/

你可能感兴趣的文章
纯DIV+CSS简单实现Tab选项卡左右切换效果
查看>>
栈(一)
查看>>
LINUX档案权限
查看>>
数据结构及算法基础--优先队列(Priority Queue)
查看>>
C#使用Timer.Interval指定时间间隔与指定时间执行事件
查看>>
最浅显易懂的数据库索引讲解
查看>>
tcp/ip基础知识
查看>>
你必须非常努力,才能看起来毫不费力[转载]
查看>>
js遍历集合
查看>>
姑娘你大胆地往前走——答大二学生XCL之八问
查看>>
UVA196
查看>>
ios 自定义delegate(一)
查看>>
创建美国地区的appleId
查看>>
例题10-2 UVa12169 Disgruntled Judge(拓展欧几里德)
查看>>
[c语言]c语言中的内存分配[转]
查看>>
JS 原生ajax写法
查看>>
day 10 字符编码和文件处理 细节整理
查看>>
如何打造亚秒级加载的网页1——前端性能
查看>>
「陶哲軒實分析」 習題 3.5.9
查看>>
HDR和bloom效果的区别和关系
查看>>