【问题标题】:Running Emgu.CV on linux在 Linux 上运行 Emgu.CV
【发布时间】:2020-12-26 17:17:32
【问题描述】:

我正在尝试在 linux 上使用 Emgu,但收到错误消息:

未处理的异常。 System.TypeInitializationException:
“Emgu.CV.CvInvoke”的类型初始化程序引发了异常。
---> System.DllNotFoundException: 无法加载共享库 'cvextern' 或其依赖项之一

SOdocumentation 环顾四周后,我明白我需要:

确保非托管 DLL 位于执行目录中。

但是 - 我如何获得它们?
如果我在 Windows 机器上运行相同的项目(+ 取消注释对 Emgu.CV.runtime.windows 包的引用),我确实在我的 bin 文件夹中获得了 x86x64 文件夹,我可以从中获取二进制文件,但显然当使用Emgu.CV.runtime.ubuntu 包,不会创建这些文件夹。


最小的、可重现的示例:
Program.cs:

using Emgu.CV;
using Emgu.CV.Structure;
using System;

namespace temp
{
    class Program
    {
        static void Main(string[] args)
        {
            // Works on windows, fails on linux
            var imageFromBytes = new Image<Rgb, byte>(2, 2);


            //// Later on I would like this to work as well...
            // var bytes = new byte[] { 1, 2, 3, 4 };
            // CvInvoke.Imdecode(bytes, Emgu.CV.CvEnum.ImreadModes.Color, imageFromBytes.Mat);
        }

    }
}

项目文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Emgu.CV.runtime.ubuntu" Version="4.4.0.4061" />

    <!-- When running on windows & uncommenting this line - I get can get the binaries-->
    <!-- <PackageReference Include="Emgu.CV.runtime.windows" Version="4.4.0.4061" /> -->

  </ItemGroup>

</Project>


其他信息:
dotnet 版本:3.1.301
Emgu 版本:4.4.0.4061

【问题讨论】:

    标签: c# .net-core emgucv


    【解决方案1】:

    所以,经过几天的挣扎 - 回答我自己的问题。

    据我了解,这里有两个问题:

    1. libcvextern.so 不见了。
    2. 缺少libcvextern.so 依赖项。

    解决问题:

    1.缺少 libcvextern.so

    1. 下载了Emgu.CV.runtime.ubuntu
    2. 解压得到libcvextern.so文件(build/x64/libcvextern.so)。
    3. libcvextern.so文件添加到项目中并将Copy to Output directory设置为Copy if Newer

    注意:对于 windows nuget 包,您需要的文件会自动添加。不知道为什么 linux 不会发生这种情况。

    2。缺少依赖项:

    1. 根据documentation(Linux -> 准备就绪),我已经克隆了 repo 并运行了确保安装所有依赖项的脚本:

    获取 dotnet 框架:

    wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    dpkg -i packages-microsoft-prod.deb
    

    获取源代码:

    git clone https://github.com/emgucv/emgucv emgucv 
    cd emgucv
    git submodule update --init --recursive
    

    确保依赖项可用:

    # cd into the relevant platform
    cd platforms/ubuntu/20.04
    
    # As per documentation: This only needs to be run once.
    ./apt_install_dependency
    
    # This is what actually builds the dependencies. This will take a while...
    ./cmake_configure
    
    

    奖励:
    如果你和我一样,对你的机器没有 root 权限,你可以使用 docker。
    我用过的Dockerfile:

    FROM ubuntu
    ENV LC_ALL=C.UTF-8 LANG=C.UTF-8
    
    
    # Bring the dotnet Framework
    RUN wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    RUN dpkg -i packages-microsoft-prod.deb
    RUN apt-get update; \
      apt-get install -y apt-transport-https && \
      apt-get update && \
      apt-get install -y dotnet-sdk-3.1
    
    
    # Make sure all emgu dependencies are in place
    # http://www.emgu.com/wiki/index.php/Download_And_Installation#Getting_ready
    WORKDIR /mnt/emgu_repo
    RUN git clone https://github.com/emgucv/emgucv emgucv
    WORKDIR /mnt/emgu_repo/emgucv
    RUN git submodule update --init --recursive
    WORKDIR /mnt/emgu_repo/emgucv/platforms/ubuntu/18.04
    RUN apt-get update && apt-get -y install sudo
    RUN `cat ./apt_install_dependency.sh | grep -Ev "\#\!"` -y
    RUN ./cmake_configure.sh
    
    
    ENTRYPOINT ["bash"]
    

    【讨论】:

    • 你找到libcvextern没有被复制的原因了吗?我有同样的问题,手动复制它可以解决所有问题。但是我们有自动构建,我不能每次都这样做。我用的是 4.4,因为 4.5.1 版本不支持 ubuntu 18.04。
    • 对不起,没有...这也是不久前的事了,我不记得所有的细节了。
    • 没问题,我发现nuget中的targets文件不正确,所以它实际上从来没有将.so文件复制到输出目录。它不会发生在基于运行时标识符的较新的 nuget 上。
    【解决方案2】:

    分享我的答案

    Avi Turner 的回答很有帮助。运行以下命令并检查是否缺少任何依赖项。 (例如Trying to get Emgu.CV running in dotnet core 3.1 on debian

    ldd libcvextern.so

    安装缺少的依赖项

    apt-get update&amp;&amp;apt-get install libgdiplus libx11-dev libgeotiff-dev libxt-dev libopengl-dev libglx-dev libusb-1.0-0

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2019-09-05
      • 2019-04-29
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多