2011-08-18 146 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