利用unsafe代码在C++和C#之间传递图像
来源:互联网 发布:mac 免密码登录 编辑:程序博客网 时间:2024/06/07 21:11
在实际应用中,经常遇到用OpenCV等C++平台的库来采集图像,然后传递到C#中进行绘制的情况。这时,从C++向C#中传递图像(数组)就成了一个重要的问题。
这里记录实验过的三种方法。
1. 先前一直采用逐像素拷贝的方法:
C++中定义采集图像函数:
extern "C" __declspec(dllexport) bool __stdcall GetBGRMap(BYTE *bgrMap){bool result = capture->retrieve( bgrImage, CV_CAP_OPENNI_BGR_IMAGE ) ;for (int i=0;i<480;i++){for (int j = 0;j<640;j++){bgrMap[(i*640+j)*4+0] = bgrImage.data[(i*640+j)*3+0];bgrMap[(i*640+j)*4+1] = bgrImage.data[(i*640+j)*3+1];bgrMap[(i*640+j)*4+2] = bgrImage.data[(i*640+j)*3+2];bgrMap[(i*640+j)*4+3] = 255;}}return result;}C#中的调用方法为:
[DllImport("OpencvKinectGrabber.dll", EntryPoint = "GetBGRMap")] public static extern bool GetBGRMap(byte[] data); BGRData = new byte[640 * 480 * 4]; GetBGRMap(BGRData);2. 另外还有利用Marshal来进行内存拷贝的方法,但原理应该和上面的方法一致。
3. 上述两种方法都需要拷贝内存来进行数据传递,因为C#使用托管指针,一般不允许对指针的直接操作,因此上两种方法必须将图像数据从C++创建的内存区域拷贝到C#创建的内存区域中。但这样会导致效率下降,尤其是对于大量的数据(如图像等)。为此,第三种方法采用unsafe代码在C#中直接获取C++创建的内存区域的指针。
C++代码中直接返回图像的数据:
EXTERN BYTE* __stdcall GetBGRMap(){bool result = capture->retrieve( bgrImage, CV_CAP_OPENNI_BGR_IMAGE ) ;imshow("shit",bgrImage);return (BYTE*)bgrImage.data;}
C#中的调用方法为:
[DllImport("OpencvKinectGrabber.dll", EntryPoint = "GetBGRMap")]public unsafe static extern byte* GetBGRMap();private unsafe void grabImg(){byte* BGRData = GetBGRMap();// 在unsafe代码块中,可以和c++中一样对指针进行操作// 绘制等操作。。。}
理论上来说,第三种方法应该是效率最高的,原因就是它没有进行拷贝内存的操作,而是直接在C#中使用了C++所创建的指针。
- 利用unsafe代码在C++和C#之间传递图像
- 利用unsafe代码在C++和C#之间传递图像
- C# Unsafe代码处理图像
- 利用unsafe代碼在C++和C#之間傳遞圖像
- Android 利用handler在线程之间传递代码
- 对比使用C# unsafe代码和OpenCV进行图像处理的效率(上)
- 利用channel在goroutins之间控制同步和传递数据
- 利用 WM_COPYDATA 消息 在 C# 和 传统C++应用之间传递数据时,64位平台的问题
- JNI:在java和c之间进行数据传递
- JNI:在java和c之间进行数据传递
- 在java和c之间进行数据传递 之 JNI
- 利用Bundle在activity之间传递对象
- 利用thrift在c++、java和python之间相互调用
- 利用thrift在c++、java和python之间相互调用
- C# unsafe代码处理数据
- C#如何在对话框之间传递参数
- Parcelable和Serializable(二)--利用Parcelable在Activity之间传递自定义对象
- Parcelable和Serializable(一)--利用Serializable在Activity之间传递自定义对象
- Android应用程序四大组件之Activity入门
- WINCE 任务栏的显示隐藏
- Android Intent.ACTION_CHOOSER 与 Intent.ACTION_PICK_ACTIVITY
- 驱动向应用程序发送消息
- java 反射
- 利用unsafe代码在C++和C#之间传递图像
- 什么是代理服务器
- linux LCD驱动中的LCD参数
- javascript trim方法
- C/C++/VC++的好网站
- 哈希树
- 如何查找表中已经使用过得索引
- Rational软件安装手册—引言
- objective-c 包含 C 和 C++ (HiJack)