Emgucv ver 4.2 on Azure Функция - PullRequest
       12

Emgucv ver 4.2 on Azure Функция

2 голосов
/ 07 февраля 2020

Я хочу использовать EmguCv ver 4.2 в Azure Function V3

Я создал Azure Function v3 (. Net Core) приложение

Установлен Emgu.Cv ver 4.2.0.3636 от Nuget

Установлен Emgu.CV.Runtime. windows ver 4.2.0.3636 также из Nuget

[FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");


        try
        {
            SetPathOfEmgu();
            var image = new Image<Bgr, byte>(256, 256);
        }
        catch (Exception ee)
        {
            return (ActionResult)new BadRequestObjectResult(ee.Message);
            throw;
        }



        return (ActionResult)new OkObjectResult($"All is well");
    }

    public static void SetPathOfEmgu()
    {
        string pathValue = System.Environment.GetEnvironmentVariable("PATH");
        string emguPath = @"D:\home\site\wwwroot\x64";
        var paths = pathValue.Split(';').Where(o => o != "").ToList();
        paths.Add(emguPath);
        pathValue = string.Join(";", paths.Distinct().ToArray()) + ";";

        System.Environment.SetEnvironmentVariable("PATH", pathValue);
    }

Запуск в Debug я получаю: "Все хорошо"

Работает на Azure я получаю: «Невозможно загрузить DLL« cvextern »или одну из ее зависимостей: Указанный модуль не найден. (0x8007007E)« в строке »var image = new Image (256, 256); "

Вопрос: Как запустить Emgucv из Azure Функция V3?

@ Stuard: От: Emgu 42 Функция V3.deps. json

{
  "runtimeTarget": {
    "name": ".NETCoreApp,Version=v3.0",
    "signature": ""
  },
  "compilationOptions": {},
  "targets": {
    ".NETCoreApp,Version=v3.0": {
      "Emgu 42 Function V3/1.0.0": {
        "dependencies": {
          "Emgu.CV": "4.2.0.3636",
          "Emgu.CV.runtime.windows": "4.2.0.3636",
          "Microsoft.NET.Sdk.Functions": "3.0.1"
        },
        "runtime": {
          "Emgu 42 Function V3.dll": {}
        }
      },
      "Emgu.CV/4.2.0.3636": {
        "runtime": {
          "lib/netstandard2.0/Emgu.CV.World.NetStandard.dll": {
            "assemblyVersion": "1.0.0.0",
            "fileVersion": "1.0.0.0"
          }
        }
      },
      "Emgu.CV.runtime.windows/4.2.0.3636": {
        "dependencies": {
          "Emgu.CV": "4.2.0.3636"
        }
      },

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Кажется, функция Azure не очень хорошо поддерживает Emgu, но, согласно некоторым тестам, я нашел обходной путь, который может помочь вашей проблеме. Пожалуйста, следуйте инструкциям ниже и попробуйте.

1. Go по этой ссылке (может потребоваться зарегистрировать учетную запись и затем войти в систему) , он загрузит образец проекта (который называется «A_Basic_Program_x86»).

2. Создайте новую функцию azure на портале Azure и откройте «kudu», нажав « Расширенные инструменты (Kudu) "enter image description here

3. Затем на странице куду нажмите" Отладочная консоль "->" CMD "-" сайт " -> "wwwroot", затем создайте новую папку с именем "bin" в каталоге "wwwroot". enter image description here

4. Откройте пример проекта, который мы скачали выше, мы можем найти некоторые dll-файлы в каталоге A_Basic_Program_x86\My Simple EMGU Program x86\My Simple EMGU Program\My EMGU Program\bin\Debug. В этом каталоге есть три DLL-файла, которые нам полезны. Это Emgu.CV.dll, Emgu.CV.UI.dll и Emgu.Util.dll. enter image description here

5. Теперь go в папку "bin", которую мы создаем в каталоге "wwwroot", и перетащите эти три DLL файлы из локального в него. (как показано на скриншоте ниже) enter image description here

6. Вернитесь к примеру проекта и go в каталог A_Basic_Program_x86\My Simple EMGU Program x86\My Simple EMGU Program\My EMGU Program. Мы можем найти два dll-файла с именами opencv_core231.dll и opencv_imgproc231.dll. Повторите шаг 5 выше, перетащите эти два DLL-файла в папку «bin». Эти два dll-файла также показаны на скриншоте, который я предоставил выше.

7. Создайте функцию триггера http в вашем приложении функций и, пожалуйста, обратитесь к моему коду ниже (обратите внимание на код в красная рамка): enter image description here Здесь приведен код, аналогичный приведенному выше снимку экрана, который вы можете скопировать.

#r "Newtonsoft.Json"
#r "..\bin\Emgu.CV.dll"
#r "..\bin\Emgu.CV.UI.dll"
#r "..\bin\Emgu.Util.dll"


using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.Structure;

public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
    log.LogInformation("C# HTTP trigger function processed a request.");

    string name = req.Query["name"];

    Image<Bgr, byte> image = new Image<Bgr, byte>(256, 256);

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    dynamic data = JsonConvert.DeserializeObject(requestBody);
    name = name ?? data?.name;

    return name != null
        ? (ActionResult)new OkObjectResult($"Hello, {name}")
        : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}

Теперь мы можем использовать "Image" и "Bgr" в azure Функция без каких-либо сообщений об ошибках.

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

0 голосов
/ 17 февраля 2020

В новой версии emgucv 4.2.0.3662 появилось обновление для решения проблемы, описанной выше. Установите Nuget Emgu.CV (V.4.2.0.3662 или выше). Установите Nuget Emgu.cv.runtime. windows 4.2.0.3662

И все работает!

...