如何在C+中使用C#library+;带有VB.net GUI的OpenCV项目? 我开发了一个用非托管C++编写的应用OpenCV的应用程序,直到现在使用内置的HigGUI LIB来显示结果。

如何在C+中使用C#library+;带有VB.net GUI的OpenCV项目? 我开发了一个用非托管C++编写的应用OpenCV的应用程序,直到现在使用内置的HigGUI LIB来显示结果。,c#,c++,user-interface,opencv,unmanaged,C#,C++,User Interface,Opencv,Unmanaged,与VB.net开发人员一起,我现在想将其打包成适合销售的产品 我决定做的两个增强是添加一个GUI,然后用第三方解决方案替换人脸识别模块,从而改进人脸识别模块 问题在于第三方SDK只有一个C#API,显然其他程序员希望用VB实现该接口 我可以将我的代码移植到C#,并使用EmguCV一举两得,但是代码库相当大,我想我没有时间,但这是一个选择 我想知道的是从这里到哪里去。我是否移植到MC++,使用混合的本机程序集和托管程序集,自己用Qt编写GUI,等等 另外,我如何在.NET WinForm控件中显示

与VB.net开发人员一起,我现在想将其打包成适合销售的产品

我决定做的两个增强是添加一个GUI,然后用第三方解决方案替换人脸识别模块,从而改进人脸识别模块

问题在于第三方SDK只有一个C#API,显然其他程序员希望用VB实现该接口

我可以将我的代码移植到C#,并使用EmguCV一举两得,但是代码库相当大,我想我没有时间,但这是一个选择

我想知道的是从这里到哪里去。我是否移植到MC++,使用混合的本机程序集和托管程序集,自己用Qt编写GUI,等等


另外,我如何在.NET WinForm控件中显示Iplimage流?

在您的情况下,是否可以实现OpenCV本机代码的一些简单、高级API,以便使用PInvoke与C轻松互操作?我在过去也遇到过类似的问题,我所做的是用大约15个函数打包我的本机代码,这些函数可以从C#(使用PInvoke)轻松使用。我不知道是否可以在你的情况下简单地做,如果你不尝试,可以尝试在MC++中编写几个类,并尝试用MC++编译你的OpenCV代码,毕竟,ODC++/CLI的主要用法是在本地C++和管理语言之间建立一个桥梁(尽管我个人还是喜欢从C++中制作好的本地API和PInvoke。 至于IplImage,如果您使用的是EmguCV,那么有一个
.Bitmap
属性可以为您提供托管的
System.Drawing.Bitmap
类,该类可以使用,而无需复制底层缓冲区(我在应用程序中渲染了来自摄像头的5个实时流,效果非常好)。另一方面,如果您想手动执行此操作,而不使用EmguCV,我建议您检查他们的源代码,看看他们是如何实现此功能的,然后自己执行(基本上,您需要抓取指向内存的指针,并获取一些属性,如图像跨距、宽度、高度,并使用这些属性自己创建
位图
类)

编辑:我发现了一些用于渲染OpenCV中处理的图像的代码:

C++代码:

void __stdcall GetRectifiedImage(Calibration* calib, int left, int** dataPtr, int* stride)
{
    CvMat* mat = ((CalibrationImpl*)calib)->imagesRectified[left > 0 ? 0 : 1];

    *dataPtr = mat->data.i;
    *stride = mat->step;
}
此代码基本上填充了数据ptr和跨步(假设已知宽度和高度)

C#平沃克:

C#用法(带EmguCV):

StereoNative.GetDepthImage(校准、外ptr、外步幅);
pictureBox5.Image=新图像(640480,步幅,ptr)。位图;

不使用EMGU,你需要了解他们是如何执行代码>位图属性,只需自己做你自己的代码>位图对象.< /P> < P>我使用了EGUCV,而且效果不错。我也把OpenCV C++代码放在一个管理DLL中,而且也很好。你可以在C++方面调用。

虽然我已经决定将端口移植到MC + +上,因为我已经完成了研究,还有两个我可以使用的解决方案。 首先,我可以将C++的组件从本地C++调用到项目中。看起来很有趣,我将研究它在其他项目中的使用。

或者我可以用。看起来比第一个更像黑客,但可行


<>最后,对于任何人,在寻找C++所需的信息到它的托管窗体中时,请参见链接。看起来像是C++语言是唯一可以被编译成管理的语言,而不需要修改代码。如果我错了,请更正我。编辑:我是…< /p> <代码>。位图< /代码>看来是有希望的。第二个开发者可以使用EMGUCV到DIS。在你的第一个建议中,应用程序后端是用C++编写的,我最熟悉的语言是,我想做的是添加一个C组件,基本上是在非托管C++中使用一个托管DLL,或者移植到MC++,然后调用DLL。你的想法?肯尼提到的COM方式,你可以ALS。o使用C++/CLI作为桥梁,您可以使用2种不同的方式:将C++代码移植到MC++并调用C++组件,或者创建桥接库:使用C语言组件并具有本地API(您可以在本地C++中使用而不将其移植到MC ++)。这样的解决方案创建第三个库,作为桥梁,但允许您“保持原生”。用你的核心代码。如果你想做它,你需要创建一个托管C++库,它有一些函数导出(通过模块*.DEF文件),而这些函数可以使用管理代码。谢谢,我将研究这两种解决方案,但基于kenny和您的评论,我将尝试使用MC++路线。如果我想保持原生状态,可能出于性能原因,我将返回并尝试桥接。我从未使用过COM接口,但我倾向于这样做。也就是说,您认为呢我的代码移植到管理C++中,事情变得简单多了?还是我错过了什么?”ExpelDeleBoT,如果是我,我会转而去管理C++,它几乎可以是你想要公开的API的包装。虽然COM可以工作,但是我会尽量避免用.NET接口来避免麻烦。谢谢。我会尝试迁移到Mc++!正如我所知,这个过程相对来说比较轻松。最后我使用了EmguCV。不过我不得不重写所有内容(
[DllImport("Stereo.dll")]
public static extern void GetRectifiedImage(IntPtr calib, int left, out IntPtr data, out int stride);
StereoNative.GetDepthImage(calib, out ptr, out stride);
pictureBox5.Image = new Image<Gray, byte>(640, 480, stride, ptr).Bitmap;