2011-08-18 149 views
0

我正在为这个使用emgucv(一个.net的opencv包装)的程序挣扎大约2周。不幸的是,这个问题不是编程,而是以这样的方式设置emgucv。我没有设法为vb.net这样做,所以我尝试了这样做的蟒蛇(因为我也知道python)。当使用ironpython时,Emgucv似乎很完美,所以我创建了一个函数,它将图像作为参数并以我想要的方式进行分析,并返回其中包含结果的另一个图像。问题是我想调用这个函数,从VB.net中为它提供图像参数(它可能是一个包含路径的字符串),并成为另一个包含结果图像作为返回的字符串。我后来打算在一个设置中打包该项目,以便我可以重新分配它。如何从VB.net中轻松调用IronPython函数?

所以我问你们:你知道一种简单的方法来调用VB.net中的IronPython函数,这样我可以打包整个项目并将其重新分发给人们吗?

非常感谢您阅读本文,如果您也可以帮助解决我的问题,这将非常棒! :)

回答

1

虽然IronPython不是我的专业知识,但我对EMGU及其应用程序非常熟悉。如果您在使用IronPython的坚持以下网站清楚地显示了如何将字符串传递给IronPython Class.

下面的代码从连杆取,而不是我自己:

Option Explicit On 
Option Strict On 

Imports Microsoft.Scripting.Hosting 
Imports IronPython.Hosting 
Imports IronPython.Runtime.Types 

Module Module1 
    Sub Main() 
     Dim helloWorld As New HelloWorldVB() 
     Console.WriteLine(helloWorld.HelloWorld("Maurice")) 

    Dim runtime As ScriptRuntime = PythonEngine.CurrentEngine.Runtime 
    Dim scope As ScriptScope = runtime.ExecuteFile("HelloWorld.py") 
    Dim pythonType As PythonType = scope.GetVariable(Of PythonType)("HelloWorldIronPython") 
    helloWorld = CType(runtime.Operations.Call(pythonType), HelloWorldVB) 
    Console.WriteLine(helloWorld.HelloWorld("Maurice")) 

    Console.ReadLine() 
End Sub 
End Module 

我会按照从教程链接,但重要的代码是波纹管,因为这将导入需要运行时信息IronPython的:

**Imports Microsoft.Scripting.Hosting 
Imports IronPython.Hosting 
Imports IronPython.Runtime.Types** 

&

**Dim runtime As ScriptRuntime = PythonEngine.CurrentEngine.Runtime 
    Dim scope As ScriptScope = runtime.ExecuteFile("HelloWorld.py") 
    Dim pythonType As PythonType = scope.GetVariable(Of PythonType)("HelloWorldIronPython") 
    helloWorld = CType(runtime.Operations.Call(pythonType), HelloWorldVB) 
    Console.WriteLine(helloWorld.HelloWorld("Maurice"))** 

显然Console.WriteLine(helloWorld.HelloWorld( “莫里斯”))将被校正为:

昏暗result_location作为字符串= helloWorld.HelloWorld( “莫里斯”)

其中 “莫里斯” 会是包含图像位置的字符串。

现在我不得不问,你在Visual Studio中设置EMGU的问题我知道,特别是对那些对它不熟悉的人可能会感到沮丧。如果您希望我会很乐意帮助您正确设置它。我问的原因是因为你提供这个给最终用户,你的代码可以更高效,而不需要调用IronPython。尤其是因为每个进程都需要从硬盘读取和写入数据。

开始:我将假定您已经在您的项目中包含了对Emgu.CV,Emgu.CV.UI和EMGU.Util的引用。但必须将“opencv_core220.dll”,“opencv_imgproc220.dll”文件直接添加到项目中,并确保在属性窗口中将“复制到输出”选项设置为“始终复制”。如果不是,你会得到错误的图像格式不正确等。你只需要这两个.dll来读取图像和访问数据等,你可能需要其他.avi电影的其他人。请注意,这两个.dll现在必须与您的项目一起分发才能正常工作。

要注意这可能会改变,具体取决于您使用64位机器或32位机器,但64位EMGU版本不能在X86机器上运行。您还必须确保您的目标平台在Visual Studio中是正确的。

我希望这可以帮助你,

干杯 克里斯

+0

哇,克里斯!这是你给我的一个很好的回复!非常详细!我会稍后检查你的链接,但现在看起来它会起作用。无论如何,关于我得到的emgu错误,每当我尝试使用以下语句在visual basic中创建一个图像时:Dim img As New Image(Of Bgr,Byte)(“Proba1.jpg”)我得到一个异常,指出“初始化为Emgu.Cv.CvInvoke会引发一个异常,此外,Visual Studio会打开一个包含Image.cs的新选项卡,每当我尝试访问Emgu.CV中的Image类时都会发生这种情况。可能是因为它是Windows窗体应用程序?非常感谢! – Calin

+0

很抱歉关于我在度假时晚回复,“Emgu.CV.CvInvoke的类型初始值设定项引发了一个异常。”通常情况下,opencv_core220.dll在输出目录中不可用。如果通过执行Actions:View Detail ...来查看错误,则InnerException可能会读取{“无法加载DLL'opencv_core220':找不到指定的模块。 (从HRESULT异常:0x8007007E)“}或类似的,我说你必须添加”opencv_core220.dll“,”opencv_imgproc220.dll“文件直接到你的项目[继续] – Chris

+0

[]然后在解决方案资源管理器中选择每个文件并更改“复制到输出”属性选项(在属性窗口中)复制总是这应该解决问题,而恼人的问题归结为EMGU只是一个包装,所以它仍然需要在那里的原始OpenCV类文件来处理。希望这可以解决问题Cheers – Chris