首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在C++ OpenCV项目中通过VB.net图形用户界面使用VB.net库?

如何在C++ OpenCV项目中通过VB.net图形用户界面使用VB.net库?
EN

Stack Overflow用户
提问于 2011-04-01 10:42:20
回答 3查看 1.6K关注 0票数 2

我已经开发了一个使用OpenCV的非托管C++编写的应用程序,直到现在还在使用内置的highgui库来显示结果。

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

我决定做的两个增强是添加一个GUI,其次是通过用3rdParty解决方案替换它来改进人脸识别模块。

问题是3rdParty SDK只有一个C#接口,显然其他程序员想要用VB实现这个接口。

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-01 11:26:16

在您的情况下,是否有可能实现一些简单的、高级的OpenCV原生代码应用程序接口,以便使用PInvoke轻松地与C#互操作?我在过去遇到过类似的问题,我所做的是将我的本机代码打包成大约15个函数,这些函数很容易从C# (使用PInvoke)中使用。我不知道在你的情况下是否可以轻松地做到这一点,如果不是,你可能会尝试用MC++编写一些类,并尝试使用MC++编译你的OpenCV代码,毕竟,C++/CLI的主要用途是在本机API和托管语言之间创建一座桥梁(尽管,我个人仍然更喜欢制作漂亮的本机c++并从C#对其进行PInvoke。

至于IplImage,如果你正在使用EmguCV,有一个.Bitmap属性可以为你提供可以使用的托管System.Drawing.Bitmap类,而不需要复制底层缓冲区(我在我的应用程序中渲染了5个来自摄像头的实时流,它工作得很好)。另一方面,如果你想手动完成,而不是使用EmguCV,我鼓励你检查他们的源代码,看看他们是如何实现这个功能的,然后自己做(基本上,你需要抓取指向内存的指针,并获得一些属性,比如图像步幅、宽度、高度,然后自己使用这些属性来创建Bitmap类)。

编辑:我找到了一些用来渲染在OpenCV中处理过的图像的代码:

C++代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
}

这段代码基本上是填充dataPtr和stride (假设宽度和高度已知)。

C# PInvoke:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[DllImport("Stereo.dll")]
public static extern void GetRectifiedImage(IntPtr calib, int left, out IntPtr data, out int stride);

C#使用率(使用EmguCV):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StereoNative.GetDepthImage(calib, out ptr, out stride);
pictureBox5.Image = new Image<Gray, byte>(640, 480, stride, ptr).Bitmap;

如果没有Emgu,你需要看看他们是如何实现.Bitmap属性的,然后自己动手来创建你自己的Emgu对象。

票数 2
EN

Stack Overflow用户

发布于 2011-04-01 11:36:31

我使用过EmguCV,它工作得很好。我还将我的OpenCV C++代码放在托管动态链接库中,这也很好用。您还可以拥有可以在C++端调用的COM接口的.NET代码源和接收器。

票数 1
EN

Stack Overflow用户

发布于 2011-04-01 14:58:15

尽管出于完整性考虑,我决定移植到MC++,而且因为我已经做了研究,还有另外两个我可以使用的解决方案。

首先,我可以通过embedding the mono runtime将本地C++中的C#组件调用到项目中。看起来很有趣,我会研究它,以便在其他项目中使用。

或者我可以用CLR Hosting API。看起来更像黑客,而不是第一个,但却是可行的。

最后,如果有人对查找将C++移植到其托管表单所需的信息感兴趣,请参阅this链接。看起来本机C++是唯一一种无需修改代码即可编译为托管的语言。如果我错了,请纠正我。编辑: I'm wrong..

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5512255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文