Как я могу легко вызвать функцию IronPython из VB.net? - PullRequest
0 голосов
/ 18 августа 2011

Я борюсь с этой программой, которая использует emgucv (оболочку opencv для .net) около 2 недель. К сожалению, проблема не в программировании, а в настройке emgucv таким образом, чтобы он работал. Мне не удалось сделать это для vb.net, поэтому я попытался сделать это для Ironpython (потому что я тоже знаю Python). Emgucv, кажется, отлично работает при использовании ironpython, поэтому я создал функцию, которая принимает изображение в качестве аргумента и анализирует его так, как я хочу, возвращая другое изображение с результатами в нем. Проблема в том, что я хочу вызвать эту функцию, передав ей аргумент изображения (это может быть строка, содержащая путь) из VB.net и стать другой строкой, содержащей полученное изображение в качестве возврата. Позже я планирую упаковать этот проект в настройку, чтобы я мог распространять его.

Итак, я спрашиваю вас, ребята: знаете ли вы простой способ вызова функции IronPython в VB.net таким образом, чтобы я мог также упаковать весь проект и распространить его среди людей?

Большое вам спасибо за то, что прочитали это, и было бы здорово, если бы вы также могли помочь мне с моей проблемой! :)

1 Ответ

1 голос
/ 19 августа 2011

Хотя IronPython не является моим опытом, я хорошо разбираюсь в EMGU и его приложениях. Если вы настаиваете на использовании IronPython, на следующем веб-сайте четко показано, как передать строку в класс IronPython.

Следующий код взят из ссылки и не мой:

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 ("Морис")) будет исправлен на:

Dim result_location As String = helloWorld.HelloWorld ("Морис")

Где "Морис" будет строкой, содержащей местоположение вашего изображения.

Теперь я должен спросить о проблемах, которые у вас возникали при настройке 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.

Надеюсь, это вам поможет,

Приветствие Chris

...