Как я могу легко вызвать функцию IronPython из VB.net?

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

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

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


person Calin    schedule 18.08.2011    source источник


Ответы (1)


Хотя 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 в Visual Studio. Я знаю, что это может быть неприятно, особенно для новичков. Если вы хотите, я буду рад помочь вам настроить его должным образом. Причина, по которой я спрашиваю, заключается в том, что, поскольку вы предоставляете это конечному пользователю, ваш код может быть более эффективным без вызова IronPython. Тем более, что каждый процесс потребует чтения и записи с жесткого диска.

Для начала: я предполагаю, что вы включили в свой проект ссылки на Emgu.CV, Emgu.CV.UI и EMGU.Util. Но важно, чтобы вы добавили файлы «opencv_core220.dll», «opencv_imgproc220.dll» непосредственно в свой проект и убедились, что в окне свойств для параметра «Копировать в вывод» установлено значение «Копировать всегда». Если это не так, вы получите ошибки, связанные с отсутствием изображения в правильном формате и т. д. Вам действительно нужны только эти две .dll для чтения изображений и доступа к данным и т. д., вам могут понадобиться другие, например, для фильмов .avi. Обратите внимание, что эти две .dll теперь должны распространяться вместе с вашим проектом, чтобы он работал.

Обратите внимание, что это может измениться в зависимости от того, используете ли вы 64-битную машину или 32-битную машину, но 64-битная версия EMGU не будет работать на машинах X86. Вы также должны убедиться, что ваша целевая платформа указана правильно в Visual Studio.

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

Ура Крис

person Chris    schedule 19.08.2011
comment
Вау, Крис! Это отличный ответ, который вы мне дали! Очень подробно! Я проверю вашу ссылку позже, так как сейчас я не могу, но, похоже, она будет работать. В любом случае, об ошибках emgu, которые я получаю, всякий раз, когда я пытаюсь создать изображение в Visual Basic, используя этот оператор: Dim img As New Image (Of Bgr, Byte) (Proba1.jpg), я получаю исключение о том, что тип инициализирован для Emgu .Cv.CvInvoke вызвал исключение. Кроме того, Visual Studio открывает новую вкладку, содержащую Image.cs. Это происходит каждый раз, когда я пытаюсь получить доступ к классу Image из Emgu.CV. Может быть, это потому, что это приложение Windows Forms? Большое спасибо! - person Calin; 19.08.2011
comment
Привет, извините за поздний ответ, который я получил в отпуске. Инициализатор типа для «Emgu.CV.CvInvoke» вызвал исключение. Обычно это связано с тем, что opencv_core220.dll недоступен в выходном каталоге. Если вы копаетесь в ошибке, выбрав «Действия: просмотр подробностей...», InnerException, вероятно, будет читать {Невозможно загрузить DLL «opencv_core220»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E)} или подобное, как я сказал, вам нужно добавить файлы opencv_core220.dll, opencv_imgproc220.dll непосредственно в ваш проект [продолжение] - person Chris; 25.08.2011
comment
[] затем в обозревателе решений выберите каждый файл и измените параметр свойств «Копировать в вывод» (в окне свойств) на «Всегда копировать». Это должно решить проблему, в то время как раздражает, что проблема связана с тем, что EMGU является только оболочкой, поэтому для работы с ним все еще нужны исходные файлы классов OpenCv. Я надеюсь, что это решит проблему. - person Chris; 25.08.2011
comment
На всякий случай я только что отметил, что в другой раз эта ошибка может стать очевидной, в этом случае InnerException будет читать {Была предпринята попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B)}. Это связано с целевой платформой. Я обычно использую 64-битную скомпилированную версию EMGU, и из-за этого вы можете ориентироваться только на платформы x64 (я не уверен, относится ли это к x86), но это легко исправить, изменив свойства проекта на вкладке «Сборка». опции. Заботиться - person Chris; 25.08.2011
comment
Спасибо Крис! Эта проблема решена! Но теперь я получаю еще одно исключение при попытке запустить программу, говоря: Невозможно загрузить DLL «cvextern»: указанный модуль не найден. (Исключение из HRESULT: 0x8007007E). Я добавил в проект cvextern.dll, но это не решило мою проблему. Я также попытался добавить ссылку на cvextern.dll, но оказалось, что это недопустимый COM-компонент. Спасибо за ваш ответ и помощь, и я надеюсь, что вы прекрасно провели время в отпуске! - person Calin; 25.08.2011
comment
Привет, Калин, да, к сожалению, вы не можете добавить их в качестве ссылок (это было бы намного проще», я предполагаю, что вы исправили свойства cvextern.dll на «Всегда копировать». Скорее всего, это после еще одной .dll, которая получена из этого конкретного два, о которых я упоминал ранее, — это минимум, необходимый для загрузки изображений и доступа к их данным. Есть два способа решения проблемы: - person Chris; 26.08.2011
comment
1) Добавляйте все dll и удаляйте одну за другой, пока снова не сломаете (я ненавижу этот метод, но он работает, и если вы не распространяете программу повторно, вам не нужно беспокоиться об удалении ненужных) 2) Попробуйте добавление этих dll ... opencv_ml220.dll , opencv_highgui220 и, конечно же, cvextern.dll со всеми свойствами, установленными для копирования всегда, они охватывают большинство необходимых функций, не зная точно, какие функции вы вызываете, я не могу сказать вам, какие именно. Боюсь, более простого варианта я еще не нашел. Ваше здоровье - person Chris; 26.08.2011
comment
Спасибо Крис! Извините за столь поздний ответ. Это, казалось, решило мою проблему. Большое спасибо за ваше время и усилия! - person Calin; 29.08.2011