Emgu的Image(Of Gray,Byte)转OpenCV的IplImage
来源:互联网 发布:成捷迅线路软件 编辑:程序博客网 时间:2024/06/08 19:56
最近在做VB.Net和C++进程间用内存映射文件通信的项目。
VB.NET和C++之间的通信就需要传送统一的文件格式,让VB和C++都能解析。
就会遇到这样地问题:VB.NET中Emgu的Image(Of Gray,Byte)怎么才能转为C++中OpenCV的IplImage格式呢?
进程间通信,我用的是内存映射文件的方式,在本文中就不多做讨论了。主要讨论两种格式之间的转换。
首先VB端创建内存映射文件,把Image(Of Gray,Byte).MIplImage.imageDataOrigin指针指向的内存写入内存映射文件中
因为本文的研究对象都是灰度图,所以MIplImage.imageDataOrigin中存放的都是0-255的灰度值。方向是以左上角为起点,横向扫描。
- 'imgbytes是Byte()类型的图片文件
- Dim img As Image(Of Gray, Byte) = New Image(Of Gray, Byte)(Image.FromStream(New MemoryStream(imgbytes)))
- '图片的宽度需是4字节的倍数
- Dim mmfImgSize As Integer = Int((img.Width + 3) / 4) * 4 * img.Height
- Dim mmfPaper As MemoryMappedFile = MemoryMappedFile.CreateNew("test1", mmfImgSize)
- Using Stream As MemoryMappedViewStream = mmfPaper.CreateViewStream()
- '把需要通信的图片写入内存映射文件中。宽高通过C++可执行文件的参数传递
- Dim writer As BinaryWriter = New BinaryWriter(Stream)
- Dim byteSize As Integer = Int((img.Width + 3) / 4) * 4 * img.Height
- Dim imageDataByte(byteSize - 1) As Byte
- '读取指针中的内容
- Marshal.Copy(img.MIplImage.imageDataOrigin, imageDataByte, 0, byteSize)
- writer.Write(imageDataByte)
- End Using
因为是灰度图,所以通道数我们默认设为1.图片的宽和高,我用的是调用C++命令行可执行文件的参数的形式传递的。
以下是C++端的代码:
char *mmfName是内存映射文件的文件名
char *imgWidth是图片的宽度
char *imgHeight是图片的高
- int mmfImgSize = (atoi(imgWidth) + 3)/4 * 4 *atoi(imgHeight);
- bmpWidth = atoi(imgWidth);
- bmpHeight = atoi(imgHeight);
- //需要将char转为LPCWSTR
- WCHAR wszClassName[100] = {0};
- memset(wszClassName,0,sizeof(wszClassName));
- MultiByteToWideChar(CP_ACP,0,mmfName,strlen(mmfName)+1,wszClassName,sizeof(wszClassName)/sizeof(wszClassName[0]));
- //打开共享的文件对象。
- HANDLE m_hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, wszClassName);
- //获得映射视图
- char* mmfm_base_address = (char*)MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, mmfImgSize);
- DWORD error_code;
- if(mmfm_base_address == NULL){
- /*error_code = GetLastError();
- if(error_code != SUCCESS){
- cout<<"error code "<<error_code<<endl;
- }*/
- return false;
- }else{
- IplImage *srcBitmap = cvCreateImageHeader(cvSize(bmpWidth,bmpHeight),IPL_DEPTH_8U,1);
- cvSetData(srcBitmap,mmfm_base_address,(bmpWidth + 3)/4*4); //第3个参数是行字节数
- return true;
- }
以上就完成了Emgu的Image(Of Gray,Byte)转OpenCV的IplImage。
但是还需注意,如果图片是由cvCreateImage初始化的,那么用cvReleaseImage来释放;
如果图片是由cvCreateImageHeader初始化的文件头,那么用cvReleaseImageheader(&iplImage)来释放。
初始化后的imageDataOrigin和imageData指向的是同一个地址。
openCV论坛上的大神解释的是:“预留数据接口吧!上面有这么一句话:IplImage结构来自于Intel Image Processing Libray(是其本身所具有的)。OpenCV只支持期中的一个子集。”
转载于:http://blog.csdn.net/u013162930/article/details/47954627
- Emgu的Image(Of Gray,Byte)转OpenCV的IplImage
- Emgu的Image(Of Gray,Byte)转OpenCV的IplImage
- byte * 转opencv IplImage
- 【OpenCV】OpenCV的类型转换问题(BYTE、IplImage、Mat等)
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV的CvArr, Mat, CvMat, IplImage, BYTE转换
- OpenCV的CvArr, Mat, CvMat, IplImage, BYTE转换 .
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCV中IplImage图像格式与 BYTE图像数据的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- opencv CvArr、Mat、CvMat、IplImage、BYTE之间的转换
- OpenCV中IplImage图像格式与BYTE图像数据的转换
- OpenCv中IplImage图像格式与BYTE图像数据的转换
- i420转opencv的IplImage
- i420转opencv的IplImage
- OpenCV的IplImage转bmp
- .NET PDF转图片
- suse linux enterprise 单用户模式
- H5学习之旅-H5的样式(5)
- c语言中.h文件的作用
- error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
- Emgu的Image(Of Gray,Byte)转OpenCV的IplImage
- koa使用之中文分词与自动分类推荐的实现
- 关于java.lang.IllegalMonitorStateException
- iOS 集成银联支付(绕过文档的坑,快速集成)
- HDU 2571 命运
- JS获取request参数 和改变request参数
- Android Native 同步类
- MAVEN搭建SPRINGMVC+HIBERNATE遇到的问题及解决方案
- UIScrollView