MFC上显示摄像头JPEG图片数据的两种方法
2015-12-31 16:36
363 查看
其一是借助opencv,其二是利用流对象。
方法一:
下面这个是个学习资料。
利用opencv读取图片并在MFC上显示,链接地址:http://licong1018.blog.163.com/blog/static/9026978420129239178934/
方法二:
方法一:
CvMat *mat; //创建矩阵 mat = cvCreateMat(640,480,CV_8UC1); //指定分配内存大小 cvInitMatHeader(mat,640,480,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像数据的地址。现在很多摄像头是支持JPEG输出的,而且JPEG图像输出节 省宽带。640*480大小的图片大小仅在20K以内。网上提到的什么视频采集卡,提供的SDK也基本提供JPEG数据,它获得的数 据就是图像数据,而不是图像文件。*/ IplImage *pIplImage = cvDecodeImage(mat,CV_LOAD_IMAGE_COLOR); //这里将JPEG图像数组转化为IplImage类,这里自动包含了解压JPEG格式图片功能。 if(pIplImage != NULL) //如果解压失败得到的是NULL { CvvImage cimg; //CvvImage类在opencv 2.2以后没有CvvImage类了,网上搜索这个类,有低版本的源代码,直接添加到工程里就可以用了。 cimg.CopyOf( pIplImage); //复制图像 cimg.DrawToHDC(pMainDlg->m_DispHDC, &pMainDlg->m_DispRECT); //显示图像 cvReleaseImage(&pIplImage);//释放图像 } cvReleaseMat(&mat); //释放矩阵
下面这个是个学习资料。
利用opencv读取图片并在MFC上显示,链接地址:http://licong1018.blog.163.com/blog/static/9026978420129239178934/
方法二:
void CTestDlg::DisplayJPEG(HDC hDC,unsigned char *buf,UINT bufLen,int rectWidth,int rectHeight) { HGLOBAL hImageMemory=GlobalAlloc(GMEM_MOVEABLE, bufLen);//给图片分配全局内存 void *pImageMemory=GlobalLock(hImageMemory); //锁定内存 if(pImageMemory == NULL) { TRACE("can't Get Global Memory!\n"); goto ret; } memcpy(pImageMemory,buf,bufLen); //读取图片到全局内存当中 GlobalUnlock(hImageMemory); //解锁内存 IStream *pIStream; //创建一个IStream接口指针,用来保存图片流 IPicture *pIPicture; //创建一个IPicture接口指针,表示图片对象 CreateStreamOnHGlobal(hImageMemory, false,&pIStream); //用全局内存初使化IStream接口指针 OleLoadPicture(pIStream, 0, false, IID_IPicture,(LPVOID*)&(pIPicture));//用OleLoadPicture获得IPicture接口指针 if(pIStream == NULL) { TRACE("can't Get pIStream!\n"); goto ret; } OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; if(pIPicture == NULL) { TRACE("can't Get Picture Info!\n"); goto ret; } pIPicture->get_Width(&hmWidth); //用接口方法获得图片的宽和高 pIPicture->get_Height(&hmHeight); pIPicture->Render(hDC,0,0,rectWidth,rectHeight,0,hmHeight,hmWidth,-hmHeight,NULL);//在指定的DC上绘出图片 //以下代码为了保存一张图片 /////////////////////////////////////////////////////////////////////////////////// if(m_bSavePic == TRUE) { m_SaveFile.Open("Hello.jpg",CFile::modeCreate|CFile::modeWrite); //读写方式打开 m_SaveFile.Seek(0,CFile::begin); m_SaveFile.Write(buf,bufLen); //将文件读入缓存 m_SaveFile.Close(); m_bSavePic = FALSE; } /////////////////////////////////////////////////////////////////////////////////// pIStream->Release(); //释放pIStream pIPicture->Release(); //释放pIPicture ret: GlobalFree(hImageMemory); //释放全局内存 }
相关文章推荐
- iOS XML 解析(原生的)
- SpringMVC通过拦截URL控制Mybatis切换数据源
- NSString属性什么时候用copy,什么时候用strong?
- UIAlertController的使用
- ios afnetworking怎么用post请求追加参数
- C语言创建二叉树过程中遇到的一些问题
- LeetCode 96:Unique Binary Search Trees
- windows server2008下asp.net 的部署
- android中的提示信息显示方法(toast应用)
- 表连接查询
- httpRequest.CookieContainer= cookie 与 httpRequest.Headers.Add("Cookie", cookie)
- 深入解读Android开发中Activity的生命周期
- ActiveMQ简单的HelloWorld实例
- android sdk manager proxy
- 俩个int型变量m,n中有多少个bit位不同。
- TrainCascade类图解析
- HTML5学习之路--js动态添加svg节点
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- RxJava多种常用场景使用方法
- Struts2--Helloworld